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 的缩写。
ECMAScript 国际化 API 的大多数实现从Unicode CLDR派生时区缩写字符串,而不是从 IANA 派生。IANA 中的缩写只有英文,近年来许多缩写已被删除,但人们发现它们是发明的。
不幸的是,CLDR 数据集中实际包含的时区缩写非常少。
一般来说,时区缩写很难达成一致。在某些情况下,同一时区使用多个缩写。有些文化改用英语缩写,而另一些文化则有自己的语言缩写,而许多文化根本不使用它们。
鉴于这一切,我想说你仍然应该使用 Intl API 给出的输出。在有缩写可用的地方,您将拥有它们,在没有缩写的地方,您将有一个数字偏移量。是的 - 这就是当前的技术水平。