当我发出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
我想知道这是否与时区有关,以及如何避免这种行为。
答案 0 :(得分:5)
我可以重现这一点。我的时区是America / 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
答案 1 :(得分:1)
来自info coreutils 'date invocation'
当相对项目导致生成的日期越过调整时钟的边界时,通常是夏令时, 生成的日期和时间会相应调整。
单位模糊可能会导致相关项目出现问题。对于 例如,' 2003-07-31 -1 month'可能会评估到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