javascript 节点j的TZ=UTC+03:00与TZ=UTC+3的差值

relj7zay  于 2023-01-19  发布在  Java
关注(0)|答案(1)|浏览(127)

有人能给我解释一下,为什么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)

rnmwe5a2

rnmwe5a21#

TZ environment variable支持两种不同的格式:

  • 它可以是POSIX时区字符串,例如:
  • NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0
  • PST8PDT
  • CET-1
  • 它可以是IANA时区标识符,例如:
  • 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

相关问题