Ubuntu 20上Node.js服务器无法设置Asia/Tehran时区的问题
问题核心
你看到的2023-08-31T08:30:32.447Z是UTC标准格式的时间输出,这是Date对象的默认ISO字符串表示(调用toISOString()的结果),本身不代表时区设置无效。德黑兰本地时间需要通过对应方法获取,同时要确保时区配置的时机正确。
排查与修复步骤
确保
process.env.TZ设置在最顶部
必须将process.env.TZ = "Asia/Tehran";放在server.js的第一行,在任何require模块或Date相关代码执行前设置。如果放在后面,部分模块可能已经初始化了时区相关逻辑,导致设置不生效。
示例:process.env.TZ = "Asia/Tehran"; // 之后再引入其他模块或写业务代码 const express = require('express'); const app = express();用正确的方法验证时区
不要直接打印new Date()(Node环境中默认输出ISO格式UTC时间),改用以下方式验证:// 输出带时区标识的本地时间字符串 console.log(new Date().toString()); // 输出符合德黑兰时区的本地化时间 console.log(new Date().toLocaleString('fa-IR'));正常情况下,前者会显示
GMT+0330 (Iran Standard Time),后者会输出伊朗本地格式的时间。重启Node进程
如果是用PM2、systemd等进程管理器启动服务,修改代码或系统时区后必须重启进程,否则进程不会加载新的时区配置。确认系统时区生效到Node进程
系统时区修改后,Node.js默认会继承系统时区,你可以直接在Node REPL中执行以下命令验证:node -e "console.log(new Date().toString())"如果输出包含伊朗时区信息,说明系统时区已经生效,无需额外设置
process.env.TZ(除非需要覆盖系统时区)。
常见误区
Date对象在JavaScript中本质是UTC时间戳,所有时区转换都是显示层面的操作。直接打印new Date()在Node环境中默认返回ISO格式的UTC时间,这是正常行为,不代表时区设置失败。
内容的提问来源于stack exchange,提问作者sima

