为什么 TZ=UTC-8 产生 UTC+8 的日期?

Ale*_*rie 29 date timezone

洛杉矶的当前时间是 18:05。但是当我运行时TZ=UTC-8 date --iso=ns,我得到:

2013-12-07T10:05:37,788173835+0800
Run Code Online (Sandbox Code Playgroud)

日期实用程序告诉我时间是 10:05,甚至说它报告为 UTC+8。为什么?

cjm*_*cjm 35

原因是它TZ=UTC-8被解释为POSIX 时区。在 POSIX 时区格式中,3 个字母是时区缩写(任意),数字是时区落后UTC的小时数。因此,UTC-8表示缩写为“UTC”的时区比实际 UTC 晚 -8 小时,或 UTC + 8 小时。

(之所以这样工作,是因为 Unix 是在美国开发的,它落后于 UTC。这种格式允许将美国时区表示为 EST5、CST6 等。)

您可以通过这些示例看到正在发生的事情:

$ TZ=UTC-8 date +'%Z %z'
UTC +0800
$ TZ=UTC8 date +'%Z %z'
UTC -0800
$ TZ=FOO-8 date +'%Z %z'
FOO +0800
Run Code Online (Sandbox Code Playgroud)

ISO-0800时区格式采用相反的方法,-指示时区落后于 UTC,并+指示时区领先于 UTC。

  • @Alex 不,您真正想要的是`TZ=America/Los_Angeles`。您忘记了夏令时的太平洋时间是 -7。 (3认同)
  • @MattJohnson,你的意思是`TZ=:America/Los_Angeles`。冒号表示它是一个奥尔森时区文件。在另一条评论中,他提到他想忽略夏令时,这是不行的。 (3认同)
  • 我花了一段时间才找出“为什么”。为什么我看到美国人又把约会弄得一团糟时并不感到惊讶 (2认同)

jor*_*anm 7

每当您以 +/-00:00 的格式指定时区时,您就是在指定offset,而不是实际时区。从GNU libc 文档(遵循 POSIX 标准):

偏移量指定您必须添加到本地时间以获得协调世界时值的时间值。它的语法类似于 [+|-]hh[:mm[:ss]]。如果本地时区在本初子午线以西,则为正值,如果为东,则为负值。小时必须介于 0 和 23 之间,分钟和秒必须介于 0 和 59 之间。

这就是为什么它似乎与您期望的相反。