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

Node.js服务器时区设置正确但时间快1小时,含node-schedule问题如何修复?

解决Node.js伊朗时区时间偏差与定时任务偏移问题

1. 清理重复的时区配置

你同时在代码和package.json脚本里设置了时区,这会导致冲突。删除server.js开头的process.env.TZ = "Asia/Tehran";,只保留package.json中的配置。因为Node.js启动时会优先读取环境变量里的TZ值,代码里的设置可能晚于node-schedule这类模块的初始化,导致它们没正确应用时区。

修改后的package.json脚本:

"scripts": {
    "start": "env TZ='Asia/Tehran' node server.js"
}

2. 更新Node.js时区数据

伊朗的夏令时政策曾有调整,旧版本Node.js内置的时区数据库可能没同步最新规则,导致计算出的时间多了1小时(错误触发夏令时偏移)。

  • 最直接的方式是把Node.js升级到最新稳定版,新版本会包含更新后的全球时区规则。
  • 如果无法升级,可安装full-icu包补充完整时区数据:
    npm install full-icu
    
    然后修改启动命令:
    "scripts": {
        "start": "env NODE_ICU_DATA=node_modules/full-icu TZ='Asia/Tehran' node server.js"
    }
    

3. 给node-schedule显式指定时区

node-schedule默认依赖系统/环境变量时区,但为了彻底避免偏差,建议创建任务时直接指定时区:

const schedule = require('node-schedule');

// 明确按Asia/Tehran时区的每天00:00执行
schedule.scheduleJob({ hour: 0, minute: 0, tz: 'Asia/Tehran' }, () => {
  // 任务代码
});

4. 验证时区是否生效

运行以下代码确认时间是否正确:

// 打印伊朗时区的当前时间
const now = new Date().toLocaleTimeString('fa-IR', { 
  hour: '2-digit', 
  minute: '2-digit',
  timeZone: 'Asia/Tehran'
});
console.log('伊朗时区当前时间:', now);

// 验证时区偏移:伊朗标准时区为UTC+3:30,对应偏移值为-210分钟
console.log('时区偏移(分钟):', new Date().getTimezoneOffset());

如果偏移值输出-210,说明时区配置正确。

内容的提问来源于stack exchange,提问作者mohammad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:05:12