【问题标题】:How to get timezone abbreviations from javascript Intl.DateTimeFormat如何从 javascript Intl.DateTimeFormat 获取时区缩写
【发布时间】:2020-07-20 12:25:34
【问题描述】:

我正在尝试使用 ECMA-402 国际 API 来获取非本地时区(服务器时区为 UTC)中的时区缩写。我知道其他方法可以得到这个。我试图了解并充分利用 International 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));

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

Wed, 04/08/2020, 18:14:50 GMT+12
Tue, 04/07/2020, 23:14:50 PDT

America/Los_Angeles 时区按预期获得时区缩写,但 Pacific/Auckland 时区没有。 IANA tz 数据库有 Pacific/Auckland 的缩写,由操作系统 (Debian Linux) 生成。

我有什么不同的方法可以从国际 API 中获取缩写吗?或者这仅仅是最先进的技术?

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

【问题讨论】:

    标签: javascript timezone


    【解决方案1】:

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

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

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

    考虑到这一切,我想说您仍然应该使用 Intl API 给出的输出。在有缩写的地方你会得到它们,在没有它们的地方你会有一个数字偏移量。是的 - 这就是当前最先进的技术。

    【讨论】:

    • 感谢您对 Unicode CLDR 的引用。我没有意识到这一点。我将 ECMA-402 的第 6.4 节误解为要使用 IANA 数据库,而不是如它所说的那样使用其中的区域和链接名称。这是对我理解的一个非常有帮助的修正。
    • 是的,CLDR 还使用 IANA 区域/链接名称作为规范参考。一般来说,IANA 是偏移/转换的来源,而 CLDR 是本地化的来源。缩写位于奇怪的灰色区域,并且在两者中都处理得不好。两者都不会自称是“标准”,尽管它们是我们最接近的东西。
    猜你喜欢
    • 2013-10-12
    • 1970-01-01
    • 2017-02-20
    • 1970-01-01
    • 2013-10-15
    • 2013-11-26
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多