![bash date 中的算术运算... ¿是相反的?](https://linux22.com/image/69896/bash%20date%20%E4%B8%AD%E7%9A%84%E7%AE%97%E6%9C%AF%E8%BF%90%E7%AE%97...%20%C2%BF%E6%98%AF%E7%9B%B8%E5%8F%8D%E7%9A%84%EF%BC%9F.png)
编辑:使用亚马逊Linux:
Linux ip-xx-xx-xx-xxx 3.14.44-32.39.amzn1.x86_64 #1 SMP 6 月 11 日星期四 20:33:38 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
该命令的输出:
date +"%Y-%m-%d %H:%M:%S" --date="2015-07-27 00:11:22"
2015-07-27 00:11:22
该命令的输出:
date +"%Y-%m-%d %H:%M:%S" --date="2015-07-27 00:11:22 + 00:05"
2015-07-27 00:06:22
该命令的输出:
date +"%Y-%m-%d %H:%M:%S" --date="2015-07-27 00:11:22 - 00:05"
2015-07-27 00:16:22
天哪,时间倒流了吗?还是第八层的问题?
编辑:我的 Amazon Linux 的时间为 UTC+00:00,而我的 Ubuntu 本地计算机的时间为 UTC-05:00。 Ubuntu 中的相同命令显示:
2015-07-26 19:11:22
2015-07-26 19:06:22
2015-07-26 19:16:22
分别,所以+ 00:05
似乎不是时区。
答案1
根据消息来源gnulib 的 parse-datetime.y,它似乎是一个与函数相关的特性时区_hhmm。
首先,我们无法使用您的格式添加秒:date +"%Y-%m-%d %H:%M:%S" --date="2015-07-27 00:11:22 - 00:05:01"
,我遇到解析错误:
date: invalid date ‘2015-07-27 00:11:22 - 00:05:01’
然后,根据time_zone_hhmm函数的头:
/* Convert a time zone expressed as HH:MM into an integer count of
minutes. If MM is negative, then S is of the form HHMM and needs
to be picked apart; otherwise, S is of the form HH. As specified in
http://www.opengroup.org/susv3xbd/xbd_chap08.html#tag_08_03, allow
only valid TZ range, and consider first two digits as hours, if no
minutes specified. */
因此,看起来您正在修改时区,这与反向添加/删除时间的行为相匹配。
如果你想按时进行算术,你最好使用 Epoch 时间戳(日期 +'%s'),这样更容易执行计算。此外,它们基于 UTC 时间,不考虑您正在使用的服务器的本地时区。
因此,时间戳将在美国、亚洲或欧洲返回相同的结果。然后,您使用此时间戳来显示人类可读的时间,其中考虑了时区。
不管怎样,不错的收获。如果没有这个好技巧,我永远不会挖掘 gnulib 源代码!