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

时间:2019-04-02 15:03:07

标签: node.js

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

似乎它具有自己的版本,因为process.versions返回here所述的时区版本。如果是这样,我是否需要安装新的Node.js版本以更新时区数据,还是有其他方法?

1 个答案:

答案 0 :(得分:1)

Node.js从ICU库(又名 Unicode国际组件)获取时区数据,该库还提供API artefacts to obtain timezone data。通常,Node.js和ICU库都不从操作系统查询外部时区文件。 ICU库使用其自己的数据文件集,包括在构建时收集的IANA timezone data。除此之外,请注意,tz提供的process.versions属性将时区数据部分引用为ICU库的一部分。我待会儿再讲。

根据Node.js发行版的不同,您可以使用不同的构建选项,如Node.js文档“ Internationalization Support”一节所述:

  • “ small-icu”:ICU库以及已编译到可执行文件中的ICU数据的子集是静态绑定的。显然,“ small-icu”是Nodejs.org提供的用于Node.js发行版的通用构建选项(至少对于Linux)。但是,可以将内置数据与从文件加载的ICU数据归档重叠(请参见文档“ Providing Icu Data at Runtime”部分)。存在各种NPM软件包来下载存档,例如node-icu和full-icu。

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

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

  • “无”:根本没有绑定ICU库。因此没有可用的时区数据。

通常应注意ICU data archive is updated less frequently than the IANA timezone data。因此,即使您始终安装最新的Node.js LTS版本,也可能必须处理Node.js中过时的时区信息。这由tz属性值2018e表示,它表示时区数据的版本很旧。当前的IANA时区数据日期为2019年3月。对于大多数应用而言,这应该没问题,但是如果您需要最高的准确性,则需要寻找其他选择:

  • 获取使用“ system-icu”(或最有可能的)构建的Node.js发行版 构建自己的)可能是一个选择,但是,我不确定您是否真的可以 动态地将Node.js与库的更新版本绑定 运行。对此可能有限制。
  • 构建自己的custom ICU data archive可能是另一种选择, 但如果您从未处理过 ICU库之前。
  • 另一种选择是使用Node.js库,例如moment-timezoneTimezoneComplete,其中包括他们自己的时区汇编。的 后者似乎很有趣,因为 包含时区数据集的下级tzdata包已更新 经常。但是,库方法的缺点是,您被迫 使用库提供的特定API而非“标准” Javascript / Node.js API。尤其是如果您有一个 大型代码库,用于维护处理日期/时间的库上的代码库 对象。