计算自1970年1月1日以来的天数


10

您如何计算自1970年1月1日以来的天数?这是用于更新OpenLDAP上的shadowLastChange属性。

有没有办法使用linux date命令来做到这一点?


在Bash和大多数现代的Bourne衍生外壳中,$()出于可读性和其他原因,它比反引号更受欢迎。echo $(( $(date ...) / 86400 ))
暂停,直到另行通知。

还没有2000 ...可以有人编辑和修复标题:-)
RingØ11年

Answers:


20

ring0击败了我几秒钟,但完整的命令是:

echo $(($(date --utc --date "$1" +%s)/86400))

这取决于UTC时间。结果:

root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984

一个快速检查与WolframAlpha的表演,这是正确的值。


1
leap秒呢?:)
netvope

1
@netvope再过一秒之后,unix时间将再次重置一次。因此,每天恰好增加了86400 Unix秒。但是,Unix时间915148800可能同时代表UTC 1998-12-31T23:59:60和1999-01-01T00:00:00 en.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski '16

9

date命令可以提供自以来的秒数1970-01-01 00:00:00 UTC

  date +"%s"

您可以将结果除以3600*24得到天数(UTC)。

例如Bash

  x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))

显示天数。


9

我认为这是最简单的方法:

expr $(date +%s) / 86400

为什么这样投票?这是最好,最短和最简单的答案
Tom Corelis

1

我也需要解决此问题,但是无论一天中的什么时间,我都希望一天获得相同的值。使用此处显示的方法,值将在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将产生“表达式中的无效字符”错误在以上声明中使用时。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.