3

编辑: - 这已在“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"
  });

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

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

4

1 回答 1

6

好的,所以我对这个错误背后的原因感到有些震惊。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();

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

于 2020-09-07T08:14:22.410 回答