使用 en-US 语言环境获取时区名称

Get timezone names using en-US locale

在使用 Intl.DateTimeFormat 时,我注意到在使用没有指定时区的语言环境时未设置时区短名称,例如 en-US 语言环境不包含 Australia/Sydney 时区信息。

有没有办法在保持 en-US 语言环境的同时显示 AEST?否则,我们将不得不将 IANA 时区映射到语言环境,这似乎有点过分了。

var date = new Date();
var options = {
  hour: 'numeric', minute: 'numeric', second: 'numeric', 
  timeZone: 'Australia/Sydney',
  timeZoneName: 'short'
};

// displays 12:14:27 am AEST
console.log(new Intl.DateTimeFormat('en-AU', options).format(date));

// 12:14:27 AM GMT+10
console.log(new Intl.DateTimeFormat('en-US', options).format(date));

据我所知,如果不编写自己的具有潜在风险的代码来处理您正在寻找的内容,您就太不走运了。

Intl(以及大多数处理 l10n 和 i18n 的 JS 框架)通常搭载 CLDR。 CLDR 为这样的事情定义了规则。在这种情况下,对于 en-US 没有名称的 "specific short" 版本,因此它回退到本地化的 GMT 版本。

我建议你别管它,接受它。任何一种针对区域设置的 hackery 都不是一个好主意,因为您可能必须对多个区域设置执行此操作,然后在不断评估 CLDR 更新 Intl 时处理这些更改。