如何从 javascript Intl.DateTimeFormat 获取时区缩写

Ian*_*Ian 5 javascript timezone

我正在尝试使用 ECMA-402 国际 API 来获取不是本地时区的时区中的时区缩写(服务器时区是 UTC)。我知道其他方法来获得这个。我试图了解国际 API 的局限性并充分利用它。我可以获得完整的时区名称并自己映射它,但是由于缩写在 IANA tz 数据库中,并且国际 API 应该基于此,它似乎应该能够生成它们,这让我觉得我是做错事。

我有以下代码:

    const fmt = new Intl.DateTimeFormat('en', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: 'numeric',
        fractionalSecondDigits: 3,
        hour12: false,
        weekday: 'short',
        timeZoneName: 'short',
        timeZone: 'Pacific/Auckland' 
    });

    const now = new Date();
    console.log(fmt.format(now));

    const fmt2 = new Intl.DateTimeFormat('en', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit',
        hour: '2-digit',
        minute: '2-digit',
        second: 'numeric',
        fractionalSecondDigits: 3,
        hour12: false,
        weekday: 'short',
        timeZoneName: 'short',
        timeZone: 'America/Los_Angeles' 
    });

    console.log(fmt2.format(now));
Run Code Online (Sandbox Code Playgroud)

在节点 12.16.1 和 Firefox 73.0.1 中,这会产生如下输出:

Wed, 04/08/2020, 18:14:50 GMT+12
Tue, 04/07/2020, 23:14:50 PDT
Run Code Online (Sandbox Code Playgroud)

America/Los_Angeles 时区按预期获得时区缩写,但太平洋/奥克兰时区没有。IANA tz 数据库具有 Pacific/Auckland 的缩写,并且由操作系统 (Debian Linux) 生成它们。

有什么我可以做的不同的事情来从国际 API 中获取缩写吗?或者这只是最先进的技术?

我注意到 luxon 和 date-fns-tz 都依赖于国际 API,而且它们也无法生成 Pacific/Auckland 的缩写。

Mat*_*int 8

ECMAScript 国际化 API 的大多数实现从Unicode CLDR派生时区缩写字符串,而不是从 IANA 派生。IANA 中的缩写只有英文,近年来许多缩写已被删除,但人们发现它们是发明的。

不幸的是,CLDR 数据集中实际包含的时区缩写非常少。

一般来说,时区缩写很难达成一致。在某些情况下,同一时区使用多个缩写。有些文化改用英语缩写,而另一些文化则有自己的语言缩写,而许多文化根本不使用它们。

鉴于这一切,我想说你仍然应该使用 Intl API 给出的输出。在有缩写可用的地方,您将拥有它们,在没有缩写的地方,您将有一个数字偏移量。是的 - 这就是当前的技术水平。