![GNU 日期纪元 +%s 与现在在时间戳短语中的计算(包括月份)?](https://linux22.com/image/45562/GNU%20%E6%97%A5%E6%9C%9F%E7%BA%AA%E5%85%83%20%2B%25s%20%E4%B8%8E%E7%8E%B0%E5%9C%A8%E5%9C%A8%E6%97%B6%E9%97%B4%E6%88%B3%E7%9F%AD%E8%AF%AD%E4%B8%AD%E7%9A%84%E8%AE%A1%E7%AE%97%EF%BC%88%E5%8C%85%E6%8B%AC%E6%9C%88%E4%BB%BD%EF%BC%89%EF%BC%9F.png)
我试图在 shell 脚本中使用带时间戳短语的 gnu 日期进行日期计算,但无法解释这些差异。有人可以启发我吗?这是一个错误吗?
% date -u -d "now"
Fri Aug 2 15:07:16 UTC 2013
% date -u -d "1970-01-01 00:00:00 UTC + `date +%s` seconds"
Fri Aug 2 15:07:29 UTC 2013
% date -u -d "now -6 months -1 day"
Fri Feb 1 15:07:52 UTC 2013
% date -u -d "1970-01-01 00:00:00 UTC + `date +%s` seconds -6 months -1 day"
Tue Jan 29 15:08:03 UTC 2013
我预计最后一个的含义与之前的完全相同,因为 %s 在联机帮助页中被定义为“自 1970-01-01 00:00:00 UTC 以来的秒数”。
答案1
看来是操作顺序错误。如果我执行此命令,它会正常工作:
$ date -u -d "$(date -u -d "1970-01-01 00:00:00 UTC + `date +%s` seconds") \
-6 months -1 day"
运行这个会产生奇怪的结果:
$ date -u -d "$(date +%s) seconds -6 months -1 day"
Sun Sep 3 07:48:54 UTC 2056
但$(date +%s) seconds
用括号保护似乎可以解决这个问题:
$ date -u -d "($(date +%s) seconds) -6 months -1 day"
Fri Feb 1 15:55:12 UTC 2013