如果不使用 TZ 环境变量,节点如何确定时区?



我正在尝试诊断节点应用程序中的问题,即我在两个不同的服务器上看到不同的日期行为。

服务器实际位于英国,时区目前为英国夏令时(BST,UTC+1),但是在10月25日,BST将结束,时区将恢复为GMT/UTC。一台服务器知道 BST,另一台不知道。

例如,在正确配置的服务器上,如果本地时间 (UTC+1) 为 16:00,

const d = new Date();

d的时间部分将显示为15:00:00Z。如果我随后将 10 月 25 日之后的日期更改为

d.setDate(30);

节点将意识到时区现在是 UTC,因此,d的时间部分现在将设置为16:00:00Z

在损坏的服务器上,new Date()将以 UTC 格式返回正确的时间,但在 BST 结束后使用setDate移动日期不会将时间更改一小时。就此服务器而言,对new Date()的调用发生在 UTC 中,而不是 UTC+1。

这令人费解,因为两台服务器都process.env.LANG设置为en_GB.UTF-8,并且在两台服务器上,localectl status显示(令人困惑地)LANG=en_US.UTF-8process.env.TZ在两者上也是未定义的,那么一个人怎么知道BST而另一个不知道呢?

可能一台服务器上的默认服务器范围时区设置为UTC,而在另一台服务器上设置为Europe/London*

如果你在运行nodejs之前把它放在代码中或设置TZ环境变量,你应该很好。

process.env.TZ = 'Europe/London' 

您的部分困惑可能来自这样一个事实,即冬天UTCEurope/London是一样的。

所有这些东西都来自IANA的时区数据库。他们使用这些Continent/City字符串,因此他们不必使用 BDT/BST 或其他东西。当司法管辖区更改其日间规则时,他们会保持最新状态。

*拿着这个,鲍里斯!

最新更新