Moment.js时区异常:format('z')不总返回时区缩写的原因及缓存问题
moment.tz().format('z')返回值不一致的原因 该表现完全不是随机行为,由IANA时区数据库的内置定义直接决定,和对应时区的通用缩写是否存在有关:
- 对于有广泛公认、官方统一的时区缩写的区域(如你测试的
America/Los_Angeles美洲洛杉矶时区),IANA数据库中存储了对应冬令时/夏令时的缩写值(PST/PDT),Moment.js会直接返回该缩写
示例返回:moment.tz('America/Los_Angeles').format('z') // "PDT" - 对于没有通用官方缩写的区域(如你测试的
Asia/Magadan亚洲马加丹时区),IANA数据库没有存储对应缩写,Moment.js会自动降级返回UTC偏移量
示例返回:moment.tz('Asia/Magadan').format('z') // "+11"
如果要避免该问题导致正则校验失效,建议不要依赖z格式符的输出,按需选择稳定的格式符:
- 需要稳定返回时区偏移:使用
Z(输出±HH:mm格式)或ZZ(输出±HHmm格式) - 需要优先返回缩写、不存在时自定义兜底:可先调用
moment.zoneAbbr()获取值,判断是否为偏移格式后自行替换为预期内容
Moment.js时区缓存的存储位置
Moment.js的时区数据缓存仅存储在当前页面的运行时内存中,不会持久化存储到浏览器端:
- 每次页面刷新、脚本重新加载时,Moment.js都会重新读取引入的时区数据文件内容,不会复用之前的缓存
- 只有手动实现持久化逻辑的情况下,才会有时区数据存储在浏览器本地存储的情况
内容的提问来源于stack exchange,提问作者Anil Kumar
相关产品推荐
相关产品推荐

