bash日期和时间算术的奇怪行为

  • 本文关键字:日期 时间 bash bash time
  • 更新时间 :
  • 英文 :


>当我发出bash命令时:

date --date="2018-03-03 12:16:13 -1hour" "+%Y:%m:%d %H:%M:%S"

我希望结果是:

2018:03:03 11:16:13

但相反,我得到:

2018:03:03 15:16:13

我想知道这是否必须与时区有关,以及如何避免这种行为。

我可以重现这一点。我的时区是美洲/New_York

$ date --date="2018-03-03 12:16:13 - 1 hour" "+%Y:%m:%d %H:%M:%S"
2018:03:03 09:16:13
$ env TZ='Europe/Belgrade' date --date="2018-03-03 12:16:13 - 1 hour" "+%Y:%m:%d %H:%M:%S"
2018:03:03 15:16:13

解析器似乎将-1作为时区 GMT+01:00,然后将其转换为本地时区。

如果我们重新排列短语以避免时区解析歧义,我们可以得到您想要的结果:

$ date --date="- 1 hour 2018-03-03 12:16:13" "+%Y:%m:%d %H:%M:%S"
2018:03:03 11:16:13

来自 info coreutils 'date invocation'

当相对项导致生成的日期越过调整时钟的边界(通常为夏令时(时, 生成的日期和时间将相应调整。

单位中的模糊可能会导致相关项目出现问题。 为 例如,"2003-07-31 -1 个月"的计算结果可能是 2003-07-01,因为 2003-06-31 是一个无效的日期。 确定上个月更多 可靠地,您可以要求当前 15 日之前的一个月 月。 例如:

 $ date -R
 Thu, 31 Jul 2003 13:02:39 -0700
 $ date --date='-1 month' +'Last month was %B?'
 Last month was July?
 $ date --date="$(date +%Y-%m-15) -1 month" +'Last month was %B!'
 Last month was June!

此外,在操纵时钟变化的日期时要小心,例如 随着夏令时的飞跃。 在少数情况下,这些已添加或 从时钟中减去多达 24 小时,因此通常明智的做法是 通过将"TZ"环境变量设置为 "UTC0",然后开始历法计算。

可以通过在字符串之前放置-1 hour来避免这种情况,

$ date --date='-1 hour 2018-03-03 12:16:13' "+%Y:%m:%d %H:%M:%S"
2018:03:03 11:16:13

最新更新