计算自 1970 年 1 月 1 日起的天数

计算自 1970 年 1 月 1 日起的天数

如何计算自 1970 年 1 月 1 日以来的天数?这是为了更新影子最后更改OpenLDAP 上的属性。

有没有办法使用 Linux日期命令?

答案1

ring0 比我快了几秒,但是完整的命令是:

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

这是按照 UTC 时间进行的。结果:

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

A使用 WolframAlpha 快速检查表明这是正确的值。

答案2

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

expr $(date +%s) / 86400

答案3

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

  date +"%s"

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

例如在Bash中

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

显示天数。

答案4

我也需要解决这个问题,但我想无论在一天中的什么时间,都能获得相同的日期值。使用此处显示的方法,值将在 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=Asia/Kolkata),因为生成的“+5:30”date +%-:::z在上述语句中使用时会产生“表达式中的无效字符”错误。

相关内容