使用 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 时处理这些更改。
在使用 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 时处理这些更改。