Answers:
ring0击败了我几秒钟,但完整的命令是:
echo $(($(date --utc --date "$1" +%s)/86400))
这取决于UTC时间。结果:
root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984
一个快速检查与WolframAlpha的表演,这是正确的值。
我也需要解决此问题,但是无论一天中的什么时间,我都希望一天获得相同的值。使用此处显示的方法,值将在UTC午夜而不是当地时间午夜更改。在欧盟或美国东海岸,这似乎不太重要,因为它们与UTC距离很近,以至于在典型的工作日中,日值不会改变,但是在例如加利福尼亚,日数会改变将会在太平洋标准时间下午4点发生,这可能会带来不便。我想澳大利亚人会特别烦恼在清晨改变日值。
如果要对此进行更正,则需要在除以秒/天之前添加与UTC的偏移量。幸运的是,Linux date命令包含%z格式序列,该序列报告与UTC的偏移量。使用标准格式(此结果用于丹佛时间,MDT):
$ date +%z
-0600
。。。在计算中不能直接使用,正确的修饰符将产生我们想要的:
$ date +%-:::z
-6
将其与通常的秒/小时/天的转换放在一起,我相信以下应该输出自1970年1月1日以来的天,其中1970年1月1日本身就是零天,并且该值在当地时间午夜递增:
echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))
这种简单的计算不适用于不是整个小时都偏离UTC的时区(例如,印度,TZ =亚洲/加尔各答),因为产生的“ +5:30” date +%-:::z
将产生“表达式中的无效字符”错误在以上声明中使用时。
$()
出于可读性和其他原因,它比反引号更受欢迎。echo $(( $(date ...) / 86400 ))