如何获取时区别名对应的canonical标准时区名称?
时区别名转canonical名称实现方案
实现思路
IANA tz数据库的别名和标准名称的映射关系存放在官方的backward数据文件中,你可以通过两种方式实现需求:
方案1:使用现有tzdb封装库(推荐)
直接使用已经打包好IANA tz全量数据的@vvo/tzdb库,无需自己维护映射数据,库会随官方tz数据库定期更新。
安装依赖:
npm install @vvo/tzdb
函数实现:
import { getTimeZones } from '@vvo/tzdb'; // 初始化全局映射表,仅需执行一次 const tzAliasMap = {}; getTimeZones().forEach(tzItem => { // 标准名称自身映射 tzAliasMap[tzItem.name] = tzItem.name; // 别名绑定到对应标准名称 tzItem.alternativeNames.forEach(alias => { tzAliasMap[alias] = tzItem.name; }); }); function getCanonicalName(name) { return tzAliasMap[name] ?? null; } // 测试用例 getCanonicalName('Africa/Accra'); // 返回 'Africa/Abidjan'
方案2:无额外依赖实现
如果不想引入第三方依赖,可以手动从IANA tz数据库的backward文件中提取所有别名映射,构建静态映射表:
// 此处仅为示例,完整映射表需自行提取全量数据 const tzAliasMap = { "Africa/Accra": "Africa/Abidjan", "Africa/Abidjan": "Africa/Abidjan", // 其余别名映射... }; function getCanonicalName(name) { return tzAliasMap[name] ?? null; }
补充说明
你调研的moment-timezone和luxon仅提供时区时间转换能力,没有对外暴露别名到标准名称的映射接口,确实无法直接用来实现该需求。
内容的提问来源于stack exchange,提问作者Souperman
相关产品推荐
相关产品推荐

