>当我发出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