如何在JavaScript中获取所有标准IANA时区ID的纯净列表
我完全懂你想要的是严格贴合IANA定义的**规范时区ID(canonical time zone IDs)**列表——既要覆盖所有正经的规范ID,又不能混入那些因国家区分被拆分的衍生ID,也不能把独立的规范ID随意合并。先结合你试过的方案梳理清楚问题,再聊聊可行的方向:
你试过的无效方案复盘
Intl.supportedValuesOf('timeZone')
这个API返回的是Temporal/Intl体系自己搞的主时区标识符(primary time zone identifiers),和IANA原生的规范ID根本不是一回事。举个例子,IANA里Atlantic/Reykjavik是Africa/Abidjan的链接(也就是逻辑上是同一个时区规则),但因为分属冰岛和科特迪瓦两个国家,Intl就把它们当成了两个独立的主ID,这完全不符合IANA的规范ID逻辑。tzdb包
这个包的列表范围太窄了,它的分组规则是「同国家+夏令时/非夏令时偏移完全一致」,会把IANA认可的独立规范ID错误合并。比如America/Indiana/Indianapolis明明是独立的规范ID,却被它归到America/New_York下面,这显然不是你要的结果。直接妥协用Temporal的主ID列表
你目前不太接受这个方案,我先顺着你的核心需求分析,后面再聊聊要不要转变思路。
核心矛盾:主时区标识符 vs IANA规范ID
问题的根源在于Temporal体系发明了「主时区标识符」这个新概念,和IANA原生的规范ID逻辑产生了分歧:
IANA里的「链接(link)」关系本来是为了合并时区规则完全一致的区域,但Temporal为了区分国家归属,把一些原本是链接的ID当成了独立的主ID。
你担心的跨框架/跨语言一致性问题非常关键——如果前端用Intl的主ID列表,而后端是遵循纯IANA规范的列表,两边必然会出现不匹配的情况,这在多系统协作场景下是个大问题。
可能的可行解决方向
1. 基于IANA原始时区数据构建精准列表
如果要严格遵循IANA的规范ID定义,最准确的方式是直接基于IANA的原始时区数据库来构建列表:
- 可以找一个能准确解析IANA原始数据的npm包,比如
iana-tz-data(一定要确认它的分组逻辑是严格遵循IANA的规范ID规则的——只合并IANA明确标记为「链接」且不涉及国家区分的ID) - 也可以自己写简单的解析逻辑:下载IANA时区数据库里的
backward文件,提取所有未被标记为「链接指向其他ID」的条目,这些就是纯规范ID。
2. 重新评估Intl.supportedValuesOf('timeZone')的适配性
虽然你现在不太认可这个方案,但可以再仔细权衡:如果你的应用更在意用户的地域直觉——比如让冰岛用户看到Atlantic/Reykjavik,科特迪瓦用户看到Africa/Abidjan,哪怕它们的时区规则完全一致,那Intl的主ID列表其实更贴合用户体验。
但如果你的核心需求是和后端/其他遵循纯IANA规范的系统保持100%一致,那还是得回到纯IANA规范ID的列表上。
内容来源于stack exchange




