如何从Luxon或Intl获取所有支持的区域设置?
如何用Luxon或Intl获取所有支持的区域设置
Luxon本身没有提供像Moment.js的moment.locales()那样直接返回所有已加载区域设置的方法——它依赖运行环境的Intl API,而Intl也没有原生函数能直接返回全部支持的区域。不过可以通过以下两种方式实现需求:
方法一:利用Intl API验证候选区域
你可以先定义一份标准的区域候选列表(基于IANA语言子标签),再通过Intl API验证每个区域是否被当前环境支持:
/** * @returns 当前环境支持的所有Intl区域设置 */ static listLuxonLocales(): string[] { // 可根据业务需求扩展的基础区域列表 const candidateLocales = [ 'af', 'ar', 'az', 'be', 'bg', 'bn', 'bs', 'ca', 'cs', 'cy', 'da', 'de', 'el', 'en', 'en-AU', 'en-CA', 'en-GB', 'en-US', 'es', 'es-AR', 'es-ES', 'et', 'eu', 'fa', 'fi', 'fr', 'fr-CA', 'fr-FR', 'gl', 'he', 'hi', 'hr', 'hu', 'hy', 'id', 'is', 'it', 'ja', 'ka', 'kk', 'km', 'kn', 'ko', 'lt', 'lv', 'mk', 'ml', 'mn', 'mr', 'ms', 'nb', 'nl', 'nn', 'pa', 'pl', 'pt', 'pt-BR', 'pt-PT', 'ro', 'ru', 'sk', 'sl', 'sq', 'sr', 'sr-Cyrl', 'sr-Latn', 'sv', 'ta', 'te', 'th', 'tr', 'uk', 'ur', 'uz', 'vi', 'zh', 'zh-CN', 'zh-HK', 'zh-TW' ]; return candidateLocales.filter(locale => { try { new Intl.DateTimeFormat(locale); return true; } catch (e) { return false; } }); }
方法二:用Luxon的hasLocale方法筛选
Luxon提供了DateTime.hasLocale()方法来检查区域兼容性,结合候选列表即可得到可用区域:
import { DateTime } from 'luxon'; /** * @returns Luxon支持的所有区域设置 */ static listLuxonLocales(): string[] { const candidateLocales = [/* 同上的区域列表 */]; return candidateLocales.filter(locale => DateTime.hasLocale(locale)); }
补充说明
- 和Moment.js需要手动加载区域包不同,Luxon直接复用环境的Intl支持,所以可用区域完全取决于运行环境(浏览器版本、Node.js版本)。
- 如果需要扩展区域支持范围,可以引入
@formatjs/intl-datetimeformat这类polyfill库,并添加对应区域的数据包。
内容的提问来源于stack exchange,提问作者uminder
相关产品推荐
相关产品推荐

