你如何计算自1970年1月1日以来的天数? 这是为了更新OpenLDAP上的shadowLastChange属性。
有没有办法做到这一点使用Linux date命令?
ring0打我几秒,但是完整的命令是:
echo $(($(date --utc --date "$1" +%s)/86400))
这是UTC时间。 结果:
root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400)) 14984
WolframAlpha快速检查表明这是正确的值。
date命令可以给你自1970-01-01 00:00:00 UTC以来的1970-01-01 00:00:00 UTC 。
date +"%s"
您可以将结果除以3600*24得到天数(UTC)。
例如在Bash
x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))
显示天数。
我认为这是最简单的方法:
expr $(date +%s) / 86400
我也需要解决这个问题,但是我希望不pipe一天中的哪个时间都能得到同样的价值。 像这里显示的方法,值将在午夜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 ))
由于date +%-:::z所产生的“+5:30”会产生整个小时内没有偏离UTC的时区(例如,印度,TZ =亚洲/加尔各答)在上述语句中使用时,expression式中的“无效字符”错误。