Node.js进程启动时即锁定时区,后续修改系统时区或process.env.TZ无效;必须在启动前通过环境变量TZ(IANA时区名)显式设置,如TZ=Asia/Shanghai node app.js。

Node.js进程启动时就锁死时区,改系统设置没用
你在 VSCode 里跑 new Date().getHours(),结果和本地时间对不上,不是代码写错了,也不是 VSCode 设置漏了——而是 Node.js 进程在 启动瞬间 就读取并缓存了时区信息,之后无论你改 Windows 时间设置、执行 timedatectl set-timezone,甚至手动改 process.env.TZ,对已运行的进程完全无效。
必须在 node 命令前显式设 TZ 环境变量
正确做法只有一条:让 Node.js 进程在初始化阶段就读到你要的时区。这意味着:
- 调试时,在
launch.json的env字段里加"TZ": "Asia/Shanghai" - 终端运行时,别直接敲
node app.js,而是TZ=Asia/Shanghai node app.js - VSCode 任务(
tasks.json)中,把"command": "node"改成"command": "sh",再用"args": ["-c", "TZ=Asia/Shanghai node app.js"] - 若用
npm start,在package.json的 script 里写"start": "TZ=Asia/Shanghai node index.js"
注意:TZ 值必须是 IANA 时区名(如 Asia/Shanghai),不能是缩写(CST)、偏移量(UTC+8)或中文(北京时间)。
VSCode 终端和调试器的 TZ 配置要分开处理
VSCode 的集成终端和调试会话是两个独立环境,env 配置不互通:
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
- 终端默认不继承
launch.json的env,所以即使调试能显示正确时间,终端里node -e "console.log(new Date())"还是旧时区 - 想统一终端行为,得在
settings.json里配"terminal.integrated.env.osx"(macOS)、"terminal.integrated.env.linux"(Linux)或"terminal.integrated.env.windows"(Windows),值为{"TZ": "Asia/Shanghai"} - 但注意:这个配置只影响新打开的终端,已存在的终端需重启才能生效
容易被忽略的坑:nvm + TZ 组合失效
nvm 用户常踩一个隐蔽坑:你写了 TZ=Asia/Shanghai nvm use 18.20.4,看起来没问题,但 nvm use 本身不传递环境变量给后续命令。实际执行的是:
TZ=Asia/Shanghai /bin/zsh -c 'nvm use 18.20.4 && node app.js'
问题在于 nvm use 启动的新 shell 并不会自动继承父 shell 的 TZ。解决方法只有两个:
- 把
TZ放到~/.zsh_profile里(export TZ=Asia/Shanghai),确保 login shell 启动时就加载 - 或者彻底绕过 nvm,直接用绝对路径调用目标版本:
TZ=Asia/Shanghai ~/.nvm/versions/node/v18.20.4/bin/node app.js
最麻烦的其实是调试器附着到由 nodemon 或 pm2 启动的进程——这些工具默认不透传 TZ,你得在它们的启动参数里显式带上,比如 nodemon --exec TZ=Asia/Shanghai node app.js。

















