You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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编译的(官方发行版通常满足此条件)。

解决方案

  1. 升级Node.js版本
    升级到v20或更高版本,原代码即可在Node.js中正常运行,无需修改。

  2. 替换为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())
    
  3. 使用第三方日期库处理罕见偏移
    如果遇到没有对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 10:54:51