Node.js中Intl.DateTimeFormat时区偏移报错?是否为Bug?
Node.js与浏览器中Intl.DateTimeFormat时区偏移支持差异问题
MDN文档指出Intl.DateTimeFormat()的timeZone参数支持传入±hh:mm、±hhmm或±hh格式的UTC偏移值,但你遇到的Node.js报错、前端正常的情况,本质是两者的ICU(Unicode国际化组件)实现差异导致的。
核心原因
- 主流浏览器(如Chrome、Firefox)的ICU实现完全支持UTC偏移格式作为
timeZone参数,符合ECMA-402标准的扩展要求。 - Node.js的ICU支持情况分版本:
- 早期版本(v16及以前):默认仅允许传入IANA时区标识符(如
Asia/Tehran对应+04:30),不直接支持UTC偏移格式,因此传入+04:30会抛出RangeError。 - 较新版本(v20及以上):已默认支持UTC偏移格式的
timeZone参数,但需确保Node.js是使用完整ICU编译的(官方发行版通常满足此条件)。
- 早期版本(v16及以前):默认仅允许传入IANA时区标识符(如
解决方案
升级Node.js版本
升级到v20或更高版本,原代码即可在Node.js中正常运行,无需修改。替换为IANA时区标识符(适用于旧版本)
将UTC偏移转换为对应的IANA时区名称,比如+04:30可对应Asia/Tehran或Asia/Kabul,修改代码如下:new Intl.DateTimeFormat('en-GB', { day: "2-digit", month: "long", year: "numeric", hour: "numeric", minute: "2-digit", hour12: true, timeZone: "Asia/Tehran" }).format(new Date())使用第三方日期库处理罕见偏移
如果遇到没有对应IANA时区的罕见偏移,可借助luxon或date-fns-tz等库实现:// 使用luxon示例 const { DateTime } = require('luxon'); console.log(DateTime.now().setZone('+04:30').toFormat('dd MMMM yyyy hh:mm a'));
内容的提问来源于stack exchange,提问作者volume one
相关产品推荐
相关产品推荐

