date-fns-tz格式化时区时zzz参数无法输出PST短名称问题
问题原因
- date-fns-tz的时区格式化能力底层依赖运行环境(浏览器/Node.js)内置的
Intl.DateTimeFormatAPI,不同地区的语言包(locale)对zzz格式符的输出规则不同:你当前使用的en-GB(英国英语)locale默认优先输出GMT±时差格式的时区标识,而非PST/PDT这类区域化时区缩写。 - 低版本Node.js环境默认没有携带完整的ICU国际化数据,也会导致无法正确输出时区短名,只会返回偏移量格式。
- 额外注意:
America/Los_Angeles时区存在夏令时规则,夏季实际时区短名为PDT(GMT-7),冬季才是PST(GMT-8),不会全年固定显示PST。
解决方案
方案1:替换locale为en-US
大部分运行环境下,美国英语locale的zzz格式会默认输出时区短名,修改代码如下:
const utcToZonedTime = require('date-fns-tz/utcToZonedTime') const formatDate = require('date-fns-tz/format') // 替换en-GB为en-US const enUS = require('date-fns/locale/en-US') const tz = 'America/Los_Angeles' let tempDT = utcToZonedTime(new Date(classStartTime), tz) // 格式化参数不变 tempDT = formatDate(tempDT, 'dd-MMM HH:mm a zzz', { timeZone: tz, locale: enUS}) console.log('tempDT', tempDT) // 夏季输出 13-Aug 07:30 AM PDT,冬季输出 13-Dec 07:30 AM PST
如果是Node.js环境修改后还是输出GMT±格式,需要安装完整ICU数据:执行npm i full-icu,运行脚本时添加参数node --icu-data-dir=node_modules/full-icu your-script.js即可。
方案2:手动替换时区标识(兼容全场景)
如果需要固定输出格式或者兼容所有运行环境,可以先输出带GMT偏移的结果,再手动映射替换为对应的时区短名:
const utcToZonedTime = require('date-fns-tz/utcToZonedTime') const formatDate = require('date-fns-tz/format') const enGB = require('date-fns/locale/en-GB') const tz = 'America/Los_Angeles' let tempDT = utcToZonedTime(new Date(classStartTime), tz) tempDT = formatDate(tempDT, 'dd-MMM HH:mm a zzz', { timeZone: tz, locale: enGB}) // 手动替换偏移量为时区短名 tempDT = tempDT.replace('GMT-7', 'PDT').replace('GMT-8', 'PST') console.log('tempDT', tempDT) // 输出符合预期的 13-Aug 07:30 AM PDT 或 13-Dec 07:30 AM PST
内容的提问来源于stack exchange,提问作者Vikalp Jain
相关产品推荐
相关产品推荐

