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

时间:2018-03-12 14:26:21

标签: 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

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

2 个答案:

答案 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