Node.js 从哪里获取时区数据?

ziv*_*ziv 3 timezone node.js

Nodejs 中的 IANA 时区数据是嵌入到 Node.js 代码中还是从操作系统获取数据?

似乎它有自己的版本,如process.versions返回时区版本,如此处所述。如果是这样,我是否需要安装新的 Node.js 版本来更新时区数据,或者还有其他方法吗?

Mar*_*cus 6

Node.js 从 ICU 库(又名International Components for Unicode)获取时区数据,该库还提供API 工件来获取时区数据。通常,Node.js 和 ICU 库都不会从操作系统查询外部时区文件。ICU 库使用自己的一组数据文件,包括在构建时收集的IANA 时区数据。除此之外,请注意,tz提供的属性process.versions是指作为 ICU 库一部分的时区数据部分。我稍后会再谈这个。

根据您使用的 Node.js 发行版,可能会应用不同的构建选项,如 Node.js 文档“国际化支持”部分中所述:

  • “small-icu”:静态绑定 ICU 库以及编译为可执行文件的 ICU 数据的子集。显然,“small-icu”是 Nodejs.org 提供的 Node.js 发行版的常用构建选项(至少对于 Linux 而言)。但是,可以使用从文件加载的 ICU 数据存档覆盖内置数据(请参阅文档,“在运行时提供 Icu 数据”部分)。存在各种 NPM 包来下载存档,例如 node-icu 和 full-icu)。

  • “full-icu”:与“small-icu”相同,但将完整的 ICU 数据集编译到可执行文件中(这会产生相当大的可执行文件)。

  • “system-icu”:ICU 库与 Node.js 可执行文件动态绑定,需要作为 Node.js 安装的先决条件进行安装。因此,该库可以独立于 Node.js 安装进行更新。

  • “none”:ICU库完全不绑定。因此没有可用的时区数据。

一般来说,应该注意的是 ICU 数据存档的更新频率低于 IANA 时区数据。因此,即使您始终安装最新的 Node.js LTS 版本,您也可能必须处理 Node.js 中过时的时区信息。这是由tz属性值指示的2018e,该值指示相当旧的时区数据版本。当前 IANA 时区数据的日期为 2019 年 3 月。对于大多数应用程序来说,这应该没问题,但如果您需要最高精度,则需要寻找其他选项:

  • 使用“system-icu”构建 Node.js 发行版(或者很可能构建您自己的)可能是一种选择,但是,我不确定您是否真的可以在运行时将 Node.js 与较新版本的库动态绑定。对此可能存在限制。
  • 构建您自己的自定义 ICU 数据存档可能是另一种选择,但如果您以前从未处理过 ICU 库,那么它似乎相当复杂。
  • 另一种选择是使用 Node.js 库,例如moment-timezoneTimezoneComplete,其中包含自己的时区编译。后者似乎很有趣,因为tzdata包含时区数据集的从属包经常更新。然而,库方法的一个缺点是,您被迫使用库提供的特定 API,而不是“标准”Javascript/Node.js API。这可能会出现问题,特别是如果您有一个大型代码库来维护处理日期/时间对象的库的代码库。