如何计算自 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
在上述语句中使用时会产生“表达式中的无效字符”错误。