智利的 Node JS 当前 DST 规则
Posted
技术标签:
【中文标题】智利的 Node JS 当前 DST 规则【英文标题】:Node JS current DST rules for Chile 【发布时间】:2019-08-29 20:07:45 【问题描述】:根据规范,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 正确识别区域(“America/Santiago” whith moment.tz.guess())
【问题讨论】:
Daylight Savings Time wrongly identified by Node.js的可能重复 【参考方案1】:您提到的智利变更是 2018 年 10 月发布的 IANA TZ data version 2018f 的一部分。
Node 通过 process.versions.tz
公开 tz 版本。当前发布的 10.15.3 LTS 版本返回 2018e
,这解释了为什么您没有看到更新。我认为这将在未来的某个日期更新。
节点通过 ICU 获取其 IANA 数据。有关于编译 Node 的 ICU 支持的不同方法的说明(system-icu
、small-icu
、full-icu
)记录在 here 中,如果您自己从源代码构建 Node,则适用。唉,我找不到任何机制来直接更新 Node 的 ICU 数据,而不是自己构建 Node。
ICU 有documentation 关于如何在不更新所有 ICU 的情况下更新时区数据。但是,我看不到 Node 正在利用此功能的任何地方。
因此,当涉及到更新 Node 的时区数据时——要么目前无法完成,要么文档记录不充分。抱歉,我没有比这更好的答案了。
您确实说过您已经在使用 moment-timezone,它独立地发送其时区数据。如果您只使用矩函数(而不是 Date
对象),那么您应该得到正确的结果。
【讨论】:
谢谢马特...很好的解释。不幸的是,11.13.0 版继续使用 2018e。以上是关于智利的 Node JS 当前 DST 规则的主要内容,如果未能解决你的问题,请参考以下文章
Node.js 官网入门教程 npm(安装包版本卸载npx)package.json(scriptsdevDependencies)package-lock.json(语义版本规则符号