智利的 Node JS 当前 DST 规则

Node JS current DST rules for Chile

根据规范,Node JS (ES5) 在处理 Date 对象时应使用当前的 dts 规则。当前表示 "for now",而不是特定日期。这并不完美,但此刻对我来说已经足够了。

目前该规则有误(由于智利的法律变更)。

简单探测:

console.log(new Date()) 
Mon Apr 08 2019 12:48:08 GMT-0300 (Chile Summer Time) {}

在日期的默认 toString 末尾显示“(智利夏令时)”。实际上我们不在夏令时(它在两天前结束)并且当前偏移量应该是 -4 而不是 -3。

我尝试将 Node 升级到最新的稳定版本,但没有成功。我不想更改很多代码(在生产中)以使用 moment.js 或等价物。

有什么方法可以在现有的 Node JS 安装中更新夏令时规则吗?

提前致谢

-- 编辑--

TZ 环境变量为空。

在 Mac OSX (Mojave 10.14.4) 和 Red Hat (4.8.5-36)

上测试

moment.js 正确识别区域 ("America/Santiago" whith moment.tz.guess())

您提到的针对智利的更改是 IANA TZ data version 2018f 的一部分,于 2018 年 10 月发布。

Node 通过 process.versions.tz 公开了 tz 版本。当前发布的 10.15.3 LTS 版本 returns 2018e,这解释了为什么您看不到更新。我假设这将在未来的某个日期更新。

节点通过 ICU 获取其 IANA 数据。有关于编译 Node 的 ICU 支持的不同方法的说明(system-icusmall-icufull-icu)记录在 here 中,如果您自己从源代码构建 Node,则适用。 las,我找不到任何机制来直接更新 Node 的 ICU 数据,而无需自己构建 Node。

ICU documentation 关于如何在不更新所有 ICU 的情况下更新时区数据。但是,我在任何地方都看不到 Node 正在利用此功能。

因此,当涉及到更新 Node 的时区数据时——要么当前无法完成,要么文档不足。抱歉,没有比这更好的答案了。

您确实说过您已经在使用 moment-timezone,它独立传送其时区数据。如果你只使用矩函数(而不是 Date 对象),那么你应该得到正确的结果。