智利的 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-icusmall-icufull-icu)记录在 here 中,如果您自己从源代码构建 Node,则适用。唉,我找不到任何机制来直接更新 Node 的 ICU 数据,而不是自己构建 Node。

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

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

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

【讨论】:

谢谢马特...很好的解释。不幸的是,11.13.0 版继续使用 2018e。

以上是关于智利的 Node JS 当前 DST 规则的主要内容,如果未能解决你的问题,请参考以下文章

91JS原生:node.js对URL的解析规则

node中的优先从缓存中加载模块与模块的加载规则

JSLint,全局禁用规则

WireShark 过滤规则

Node.js 官网入门教程 npm(安装包版本卸载npx)package.json(scriptsdevDependencies)package-lock.json(语义版本规则符号

Git忽略规则.gitignore梳理