node-cron 时区仅在时区与机器时区相同时工作

ama*_*mar 3 node.js node-cron

编辑: - 这已在“node-cron”版本>“3.0”中得到解决

我有以下代码。 "node-cron": "^2.0.3"

cron.schedule('46 00 * * *',() => {
   //code to be executed
  console.log("Tik")
  },{
    scheduled: true,
    timezone: "America/New_York"
  });
Run Code Online (Sandbox Code Playgroud)

根据我的理解,无论我的机器时区如何,这都应该在美国/纽约时间上午 12:46 触发。但是直到我将时区与主机时间相匹配时它才起作用,例如,如果我的机器时区是欧洲/伦敦并且我使用timezone: "Europe/London"cron 将在确切的时间工作。

我想为特定时区安排 cron。由于我处理的时区很少,所以每半小时运行一次 cron 并进行检查看起来很有效。

Ter*_*nox 5

好的,所以我对这个错误背后的原因感到有些震惊。node-cron 使用tz-offset来计算时区偏移量……但是这个模块不考虑夏令时!所以我相信这个库从根本上是有缺陷的,因为很多时区都使用 DST(当然包括 America/New_York。为此提出了问题:https : //github.com/node-cron/tz-offset/issues/ 8 .

这意味着您的 cron 作业将在 01:46 或恰好晚一小时运行。现在它会在合适的时间运行大约半年,这几乎使这个问题变得更糟。

我建议尝试使用cron模块,代码将非常相似,但会正确处理时区,因为它使用luxon来计算 UTC 偏移量。

const CronJob = require('cron').CronJob;
const job = new CronJob('46 00 * * *', () => {
    console.log('Tik');
}, null, true, 'America/New_York');
job.start();
Run Code Online (Sandbox Code Playgroud)

更新:这看起来现在已经在 node-cron 中修复了。

  • 感谢您提供的信息,但现在似乎已经修复了!检查此https://github.com/node-cron/node-cron/issues/157 (2认同)
  • 太好了,我会更新答案来表明这一点。 (2认同)