问题描述
我使用 node-schedule 来安排在特定时间只执行一次的任务。该文档向我展示了这一点:
基于日期的调度:假设您非常特别想要一个函数 2012 年 12 月 21 日凌晨 5:30 执行。记住 - 在 JavaScript 中 - 0 - 1 月,11 日 - 12 月。
const schedule = require('node-schedule');
const date = new Date(2012,11,21,5,30,0);
const job = schedule.scheduleJob(date,function(){
console.log('The world is going to end today.');
});
但是这段代码每分钟运行一次任务,我只希望它在指定的特定时间只运行一次任务,如下所示:
const date = new Date(2012,0);
此处的日期是默认值。我在代码中将其更改为未来日期,如下所示:
const Now = new Date().getTime();
const seconds = 180;
const parsedDate = new Date(Date.parse(Now));
const date = new Date(parsedDate.getTime() + (1000 * seconds));
schedule.scheduleJob(date,function(data) {
console.log("Job ran @",new Date().toString());
});
在这里,我只想在距当前日期 180 秒(3 分钟)后 cron 作业。但是控制台结果显示控制台日志在部署后每分钟写入一次:
> Job ran @ Tue Mar 16 2021 08:56:00 GMT+0000 (GMT)
> Job ran @ Tue Mar 16 2021 08:57:00 GMT+0000 (GMT)
> Job ran @ Tue Mar 16 2021 08:58:00 GMT+0000 (GMT)
> Job ran @ Tue Mar 16 2021 08:59:00 GMT+0000 (GMT)
感谢您的帮助。
解决方法
我通过在代码中添加时区解决了这个问题。我使用了另一个帖子中的 answer。这里的函数附带了以简单的方式为日期函数添加时区功能的功能。
这应该可以解决您的问题,请随时提供修复。这 方法还将考虑给定日期的夏令时。
Date dateWithTimeZone = (timeZone,year,month,day,hour,minute,second) => {
let date = new Date(Date.UTC(year,second));
let utcDate = new Date(date.toLocaleString('en-US',{ timeZone: "UTC" }));
let tzDate = new Date(date.toLocaleString('en-US',{ timeZone: timeZone }));
let offset = utcDate.getTime() - tzDate.getTime();
date.setTime( date.getTime() + offset );
return date;
};
然后我的代码看起来像这样:
schedule.scheduleJob(dateWithTimeZone("Europe/Istanbul",req.body.year,req.body.month,req.body.day,req.body.hour,req.body.minute,req.body.second),function(data) {
console.log("Job ran @",new Date().toString());
});
最后它对我来说很好用。我只能安排在我喜欢的时区执行一次作业。
感谢您的关注。关于...
,我找到了一种简单的方法来安排 cron 作业。
const schedule = require('node-schedule');
const moment = require('moment');
const rule = scheduled.RecurrenceRule();
let time = '2021-07-30 14:20:00';
rule.tz = 'Asia/Kolkata';
rule.year = moment(time).year();
rule.month = moment(time).month();
rule.date = moment(time).date();
rule.hour = moment(time).hours();
rule.minute = moment(time).minutes();
rule.second = moment(time).seconds();
schedule.scheduleJob(rule,async function () {
console.log("Scheduled")
});