bash date 中的算术运算... ¿是相反的?

bash date 中的算术运算... ¿是相反的?

编辑:使用亚马逊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 源代码!

相关内容