coreutil 的 date 是如何得到如此奇怪的结果的?

coreutil 的 date 是如何得到如此奇怪的结果的?

我正在尝试date将诸如“2 小时”之类的表达式转换为诸如 7200 之类的秒数。我认为我可以通过以下调用来执行此操作:

date -d "1970-01-01 00:00:00 + 2 hours" +"%s"

然而,我在这样做时注意到了极其奇怪的结果。 (我的/etc/timezone包含“欧洲/巴黎”,因此使用 来TZ强制 UTC 时间。)

omega:~$ TZ=utc date -d "1970-01-01 00:00:00" +"%s"             
0
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + 0 minutes" +"%s"
60
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + -1 minutes" +"%s" 
3660
omega:~$ TZ=utc date -d "1970-01-01 00:00:00 + 1 minutes" +"%s" 
-3540

第一个结果足够合理,但我真的很困惑如何date得出最后三个结果。有人理解这些结果之间的逻辑吗?

答案1

我认为它将您+ x作为时区说明符(例如,考虑2013-04-25 19:52:36 +4是一个有​​效的时间戳,在 UTC 之前 4 小时的时区中)。

然后它会看到“分钟”这个词,并将其视为分钟的同义词,因此稍后给您一分钟。

如果您输入明确的时区说明符,它会起作用:

anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC" +"%s"   
0
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 0 minutes" +"%s"
0
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + -1 minutes" +"%s" 
-60
anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 UTC + 1 minutes" +"%s" 
60

请注意UTC秒字段之后。您还可以输入第二个+0

anthony@Zia:~$ TZ=utc date -d "1970-01-01 00:00:00 +0 + -1 minutes" +"%s"
-60

...但至少就个人而言,这更难阅读。

或者您可以Z在秒后添加 a 等。在上面的示例中,您实际上不需要TZ将环境变量设置为 UTC。

相关内容