本文详解为何直接赋值 process.env.TZ 无效,以及如何通过环境变量、toLocaleString() 和现代日期库(如 day.js)可靠实现 Tehran 时区(UTC+3:30)的本地化时间显示。
本文详解为何直接赋值 `process.env.tz` 无效,以及如何通过环境变量、`tolocalestring()` 和现代日期库(如 day.js)可靠实现 tehran 时区(utc+3:30)的本地化时间显示。
在 Node.js 中,时区(TZ)环境变量必须在进程启动前设置,而非运行时动态赋值。你执行的 process.env.TZ = "Asia/Tehran" 是无效的——因为 V8 引擎在 Node.js 进程初始化阶段已读取并缓存了 TZ 值,后续修改该环境变量不会影响内置 Date 对象的行为。这也是为什么 new Date() 仍返回 UTC 时间戳(如 2023-08-31T08:30:32.447Z),而非 Tehran 当地时间。
✅ 正确做法:在启动服务时通过 shell 环境注入 TZ:
env TZ='Asia/Tehran' node server.js
或在 package.json 中配置脚本:
"scripts": {
"start": "TZ='Asia/Tehran' node server.js"
}
然后运行 npm start 即可生效。
⚠️ 注意:new Date() 的 .toString() 或 .toISOString() 方法始终以系统默认时区(或 UTC)格式输出,不会因 TZ 变量改变而自动“本地化”。要获取 Tehran 本地时间的可读字符串,必须显式调用:
console.log(new Date().toLocaleString('fa-IR', {
timeZone: 'Asia/Tehran',
hour12: false,
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
}));
// 输出示例(波斯语本地化):۱۴۰۲/۰۶/۱۰، ۱۲:۴۵:۳۳
? 更推荐使用轻量级日期库进行健壮处理。例如,使用 day.js 配合 timezone 插件:
npm install dayjs
const dayjs = require('dayjs');
const timezone = require('dayjs/plugin/timezone');
const utc = require('dayjs/plugin/utc');
dayjs.extend(utc);
dayjs.extend(timezone);
// 直接以 Tehran 时区解析/格式化(无需依赖 process.env.TZ)
console.log(dayjs().tz('Asia/Tehran').format('YYYY-MM-DD HH:mm:ss'));
// → "2023-08-31 12:45:33"
// 支持国际化(如波斯语月份/星期)
const faLocale = require('dayjs/locale/fa');
dayjs.locale(faLocale);
console.log(dayjs().tz('Asia/Tehran').format('YYYY/MM/DD، HH:mm:ss'));
// → "۱۴۰۲/۰۶/۱۰، ۱۲:۴۵:۳۳"
? 总结关键点:
- ❌ 不要运行时设置 process.env.TZ;
- ✅ 必须在 node 启动前通过 env TZ=... 或系统级 export TZ=... 设置;
- ✅ 使用 .toLocaleString({ timeZone: 'Asia/Tehran' }) 获取浏览器/Node 环境下的本地化字符串;
- ✅ 生产项目建议采用 day.js 或 date-fns,它们绕过 TZ 依赖,支持任意时区独立计算与多语言格式化,更可控、可测试、跨平台一致。











