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

Node.js设置默认时区为Asia/Calcutta后new Date()仍返回UTC如何解决

问题根因
  1. Node.js 进程的时区默认在启动阶段读取环境变量TZ完成初始化,运行时直接修改process.env.TZ不会触发时区重载,低版本Node.js(<14)完全不支持运行时修改时区生效。
  2. 你测试时看到的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为例:

  1. 安装依赖:npm install moment-timezone
  2. 代码中全局配置:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 14:45:01