如何获取所有支持的时区的列表?

TmT*_*ron 4 timezone node.js

我们如何在运行时获取 NodeJs 中所有支持的时区的列表?

用例:

  • 我们希望在应用程序启动时进行检查,以确保主时区(通过 env-var 设置)正确)。
  • 我们想向用户显示一个列表,以便他们只能选择有效的时区

Nodejs 文档提到Node 可以与不同的 ICU 设置一起使用,因此硬编码列表(如timezones.json)将不起作用。

我发现了一些相关的问题,但似乎没有人回答这个(简单?)问题...
例如Node.js 从哪里获取时区数据?

TmT*_*ron 5

更新

NodeJs >= 18 支持Intl.supportedValuesOf()

Intl.supportedValuesOf('timeZone')
Run Code Online (Sandbox Code Playgroud)

原来的

我认为目前没有简单的方法可以在运行时获取node.js中支持的时区列表:

  • JavaScript 国际化 Api:
    规范没有提供获取支持的时区列表的方法
  • NodeJs:
    NodeJs也没有提供获取支持的时区列表的方法

解决方法

一种解决方法是以某种方式获取时区列表并单独测试每个时区。

有许多预定义的时区列表:

但是,由于我们有一个数据库应用程序,因此我们首先获取数据库支持的所有时区的列表 - 请参阅PostgreSql 文档

SELECT name
FROM pg_timezone_names
ORDER BY name;
Run Code Online (Sandbox Code Playgroud)

然后检查每个节点是否受 Nodejs 支持(这是一些 TypeScript 伪代码):

  try {
    new Intl.DateTimeFormat('en-US', {
      timeZone
    })
    // timezone is valid - add to the valid list
  } catch (e) {
    // timezone is invalid - maybe write a log msg
  }
Run Code Online (Sandbox Code Playgroud)

堆栈闪电测试

现在我们有了数据库和 NodeJ 中有效的所有时区的列表。

目前有(PostgreSql 12、NodeJs 14):

  • 547有效时区
  • 49无效时区(即 PostgreSql 已知,但 NodeJs 不知道):例如America/Argentina/ComodRivadavia, US/Alaska, ..