Node.js设置默认时区为Asia/Calcutta后new Date()仍返回UTC如何解决
问题根因
- Node.js 进程的时区默认在启动阶段读取环境变量
TZ完成初始化,运行时直接修改process.env.TZ不会触发时区重载,低版本Node.js(<14)完全不支持运行时修改时区生效。 - 你测试时看到的
2021-12-04T09:54:48.152Z这类带Z后缀的输出是UTC标准时间,这是Node.js打印Date对象时默认调用toISOString()的结果,无论时区设置是否生效,这个方法的输出永远是UTC时间,不能用来判断时区是否配置成功。
解决方案
方案1:启动进程前配置TZ环境变量(兼容性最好)
启动Node.js进程前先设置环境变量,让进程初始化时就加载对应时区:
- Linux/macOS 终端执行:
TZ=Asia/Calcutta node your-script.js - Windows CMD 执行:
set TZ=Asia/Calcutta && node your-script.js - Windows PowerShell 执行:
$env:TZ='Asia/Calcutta'; node your-script.js
配置完成后可以调用new Date().toString()验证,输出会显示印度标准时间,格式类似:Sat Dec 04 2021 15:25:33 GMT+0530 (India Standard Time)
方案2:运行时修改(仅支持Node.js 14及以上版本)
修改process.env.TZ后,Node.js会自动重载时区配置,直接调用本地时间相关方法即可生效,示例代码:
process.env.TZ = 'Asia/Calcutta' // 验证时区是否生效 console.log(new Date().toString()) // 输出印度时区时间 console.log(new Date().toLocaleString()) // 输出印度时区的本地化时间格式
方案3:使用时间库全局配置(不依赖环境变量)
如果需要跨环境保证时区统一,不受运行环境配置影响,可以使用时间处理库全局指定默认时区,以moment-timezone为例:
- 安装依赖:
npm install moment-timezone - 代码中全局配置:
const moment = require('moment-timezone') moment.tz.setDefault('Asia/Calcutta') // 后续所有moment生成的时间默认使用Asia/Calcutta时区 console.log(moment().format()) // 输出对应时区的时间
注意事项
- 时区名称
Asia/Calcutta是历史别名,目前IANA官方标准名称为Asia/Kolkata,两个名称在绝大多数环境下都兼容,若遇到拼写错误提示可以替换为标准名称。 - 不要用
toISOString()的输出来判断时区是否生效,该方法固定返回UTC时间。
内容的提问来源于stack exchange,提问作者Sangavi
相关产品推荐
相关产品推荐

