有人能给我解释一下,为什么TZ=UTC+03:00
给时区偏移-180
,和TZ=UTC+3
-180
?
$ TZ=UTC+03:00 node -e 'console.log((new Date).getTimezoneOffset())'
-180
$ TZ=UTC+3 node -e 'console.log((new Date).getTimezoneOffset())'
180
一开始我以为这是Nodejs的解析功能,试图在Nodejs文档中找到任何东西,但失败了。我试图搜索Nodejs源代码,但也没有成功。然后我开始想,这与Posix有关,并在C/C++库文档中的某个地方描述过。也没有找到...
看起来,当为date
命令设置TZ时,两个变体给出了相同的时区。
$ TZ=UTC+03:00 date +'%Z%z'
UTC-0300
$ TZ=UTC+3 date +'%Z%z'
UTC-0300
我对 * 如何正确设置TZ * 不感兴趣。我很好奇,为什么会有不同的结果。
UPD:看起来兔子洞比我想象的要深
$ TZ=UTC+01:00 node -e 'console.log((new Date).getTimezoneOffset())'
-180
$ TZ=UTC+02:00 node -e 'console.log((new Date).getTimezoneOffset())'
-180
$ TZ=UTC+10:00 node -e 'console.log((new Date).getTimezoneOffset())'
-180
Nodejs会忽略它吗?(我的本地时区是欧洲/伊斯坦布尔,因此偏移量为-180)
1条答案
按热度按时间rnmwe5a21#
TZ
environment variable支持两种不同的格式:NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0
PST8PDT
CET-1
America/Los_Angeles
Africa/Nairobi
Etc/GMT-3
在POSIX格式中(以及在
Etc/GMT*
的IANA标识符中),偏移量与正常的ISO 8601约定相反,即Etc/GMT+3
(或FOO3BAR
)通常被写为-03:00
-即比 * GMT晚3小时。当您传递
TZ=UTC+3
时,由于UTC+3
不是有效的IANA标识符,因此它被解释为一个标记为“UTC”的固定偏移时区,该时区比实际UTC晚3小时。如果
TZ
字符串既不是有效的IANA标识符,也不是有效的POSIX字符串,Node将回退到使用系统的本地时区。Node(或者ICU)有一个bug,
UTC+03:00
也应该被解释为POSIX字符串。虽然不常用,但它确实符合TZ
规范中描述的[+|-]hh[:mm[:ss]]
。https://github.com/nodejs/node/issues/46246