根据规范,Node JS (ES5) 在处理 Date 对象时应使用当前的 dts 规则。当前的意思是“现在”,而不是特定的日期。这并不完美,但目前对我来说已经足够了。
目前,该规则是错误的(由于智利法律的变化)。
简单探针:
console.log(new Date())
Mon Apr 08 2019 12:48:08 GMT-0300 (Chile Summer Time) {}
在日期的默认 toString 末尾显示“(智利夏令时间)”。实际上我们不是在夏令时(两天前结束),当前偏移量应该是 -4 而不是 -3。
我尝试将 Node 升级到最新的稳定版本,但没有成功。我不想更改大量代码(在生产中)以使用 moment.js 或等效代码。
有没有办法更新现有 Node JS 安装中的 DST 规则?
提前致谢
- 编辑 -
TZ 环境变量为空。
在 Mac OSX (Mojave 10.14.4) 和 Red Hat (4.8.5-36) 上测试
moment.js 正确识别区域(“美国/圣地亚哥”,其中 moment.tz.guess())
你提到的智利的变化是IANA TZ 数据版本 2018f https://mm.icann.org/pipermail/tz-announce/2018-October/000051.html,于 2018 年 10 月发布。
节点通过以下方式公开 tz 版本process.versions.tz https://nodejs.org/api/process.html#process_process_versions。当前发布的 10.15.3 LTS 版本返回2018e
,这解释了为什么您看不到更新。我认为这将在未来的某个日期更新。
节点通过 ICU 获取其 IANA 数据。有关于编译 Node 的 ICU 支持的不同方法的说明(system-icu
, small-icu
, full-icu
)记录here https://nodejs.org/api/intl.html,如果您自己从源代码构建 Node,则适用。唉,我找不到任何直接更新 Node 的 ICU 数据的机制,而不需要自己构建 Node。
ICU has 文档 http://userguide.icu-project.org/datetime/timezone#TOC-Updating-the-Time-Zone-Data关于如何更新时区数据而不更新所有 ICU。但是,我看不到 Node 在任何地方利用此功能。
因此,当涉及到更新节点的时区数据时,要么当前无法完成,要么记录很少。抱歉,我没有比这更好的答案了。
您确实说过您已经在使用 moment-timezone,它独立地传送其时区数据。如果您仅使用矩函数(而不是Date
对象),那么你应该得到正确的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)