Node.js中RangeError: Invalid time zone specified问题解析与解决
Node.js中
Date.toLocaleString使用+0000时区报错,但浏览器正常的原因与解决方法 测试代码
console.log("test"); const t = new Date().toLocaleString("en-US", { timeZone: "+0000" }); console.log(t);
环境差异表现
这段代码在Google Chrome 122.0.6182.0(官方开发版,64位)控制台及MDN测试页面运行均正常,但在Node.js v21.2.0环境中执行时抛出如下错误:
test /home/jdoodle.js:3 const t = new Date().toLocaleString("en-US", { ^ RangeError: Invalid time zone specified: +0000 at Date.toLocaleString (<anonymous>) at Object.<anonymous> (/home/jdoodle.js:3:22) at Module._compile (node:internal/modules/cjs/loader:1376:14) at Module._extensions..js (node:internal/modules/cjs/loader:1435:10) at Module.load (node:internal/modules/cjs/loader:1207:32) at Module._load (node:internal/modules/cjs/loader:1023:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:135:12) at node:internal/main/run_main_module:28:49 Node.js v21.2.0
问题原因
浏览器与Node.js对timeZone参数的解析规则存在差异:
- 浏览器的Intl实现(基于V8)为了兼容性或便利性,允许直接使用UTC偏移格式(如
+0000、-0500)作为时区参数。 - Node.js的Intl实现严格遵循ECMA-402标准,要求时区参数必须是IANA时区标识符(如
UTC、America/New_York),不支持直接传入UTC偏移格式。
这种差异源于不同环境对标准实现细节的处理策略不同,Node.js保持了更严格的标准合规性,而浏览器放宽了限制以适配更多使用场景。
解决方法
方案1:使用标准IANA时区标识符
将+0000替换为UTC,这是所有环境都兼容的标准时区标识符:
console.log("test"); const t = new Date().toLocaleString("en-US", { timeZone: "UTC" }); console.log(t);
方案2:处理动态偏移场景(如需)
如果需要处理非UTC的动态偏移,可选择两种方式:
- 使用对应偏移的IANA时区(比如
+0800对应Asia/Shanghai); - 借助第三方日期库(如
date-fns、luxon),这类库对时区偏移格式的支持更一致,能跨环境稳定运行。
内容的提问来源于stack exchange,提问作者mat.twg
相关产品推荐
相关产品推荐

