JavaScript如何使用内置方法输出带本地时区偏移的类ISO格式日期
答案
原生内置方案(无需手动处理时区边界/夏令时规则)
你之前调研的Intl.DateTimeFormat实际已经支持直接输出时区偏移,不需要自行计算时区规则,所有夏令时、历史时区变更逻辑都由JS引擎内置的时区数据库处理,代码量极少:
核心实现代码
function getLocalISOWithOffset(date = new Date()) { // 用en-CA locale默认输出YYYY-MM-DD格式的日期,避免额外格式转换 const formatter = new Intl.DateTimeFormat('en-CA', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', fractionalSecondDigits: 3, hourCycle: 'h23', // *核心参数*:指定输出时区偏移而非时区名称 timeZoneName: 'longOffset' }) return formatter.format(date) .replace(', ', 'T') // 把日期时间分隔的逗号空格换成标准格式的T .replace(/([+-]\d{2}):(\d{2})$/, '$1$2') // 把偏移里的冒号去掉,匹配你要的+0100格式 }
输出示例
调用getLocalISOWithOffset(new Date("2021-10-07T13:52:14.333Z"))在伦敦时区会直接输出你需要的格式:
"2021-10-07T14:52:14.333+0100"
补充说明
你之前没找到对应的能力,是因为timeZoneName除了常用的输出时区名称的short/long枚举值外,还有专门输出偏移的shortOffset/longOffset值,这两个值的官方文档提及率相对较低。
该特性属于ES2022标准定义的能力,Chrome 91+/Firefox 95+/Safari 15.4+/Node.js 16+ 都原生支持,不需要引入任何第三方依赖。如果需要兼容更早版本,仅需要引入Intl.DateTimeFormat的官方polyfill即可,不需要自行实现时区计算逻辑。
内容的提问来源于stack exchange,提问作者Chris F Carroll
相关产品推荐
相关产品推荐

