我必须计算前一天从数据库中选择数据进行报告。它工作到2016-06-30但在7月1日失败了。我没有得到2016-06-30(1日)的日期,而是2016-05-31。我的函数每天使用node-schedule调用一次,如下所示:
cron.scheduleJob({hour: 0, minute: 5}, function () {
nowDate = new Date();
fromDate.setDate(nowDate.getDate() - 1);
toDate.setDate(nowDate.getDate() - 1);
logger.info("Started daily reporting ('"+fromDate.getFullYear() + "-" + (fromDate.getMonth() + 1) + "-" + fromDate.getDate() + " 00:00:00'"+" - '"+toDate.getFullYear() + "-" + (toDate.getMonth() + 1) + "-" + toDate.getDate() + " 23:59:59')");
proc.run(fromDate, toDate, function (error) {
if (error) {
logger.error(error);
} else {
logger.info("Finished daily reporting");
}
});
});
所以7月1日的输出是:
Started daily reporting ('2016-5-31 00:00:00' - '2016-5-31 23:59:59'
知道为什么我前一天的计算失败了吗?
答案 0 :(得分:0)
问题在于fromDate
和toDate
被声明为全局变量。这些日期将初始化为应用程序运行的日期,并且在您的循环中,您尝试从该应用程序首次启动的日期时间减去1天。
您的申请可能会在其运营当天运行,但在随后的日子不运行。要解决此问题,必须在cron.scheduleJob
函数中初始化日期。
cron.scheduleJob({hour: 0, minute: 5}, function () {
let yesterdayDate = new Date();
yesterdayDate.setDate(yesterdayDate.getDate() - 1);
proc.run(/*from date=*/yesterdayDate, /*to date=*/yesterdayDate, function (error) {
if (error) {
logger.error(error);
} else {
logger.info("Finished daily reporting");
}
});
});
如果您打算进行更多日期计算或时区处理,并且正在寻找一种简单可靠的方法,请使用moment.js。它已经在JS社区中被许多其他人测试和证明。
减去今天休息日的例子;
"use strict";
var moment = require('moment');
for(let i = 1; i <= 5; i++){
console.log('lessed ' + i +' day since today = ' + moment().subtract(i, "days").format("DD-MM-YYYY"));
}
<强>输出:强>
自今天起1天内错过了= 02-07-2016
自今天起2天内失踪= 01-07-2016
自今天起3天内错过= 30-06-2016
自今天起4天内失踪= 29-06-2016
从今天开始的5天= 28-06-2016
无论如何,在聊天中指出.getDate()实现没有问题,它的工作原理。这是我做的一个小实验。
// Today is 3rd july 2016
nowDate = new Date();
nowDate.setDate(nowDate.getDate() - 1);
nowDate.setDate(nowDate.getDate() - 1);
nowDate.setDate(nowDate.getDate() - 1); // Before deduct = 1st July.
console.log("Started daily reporting ('"+nowDate.getFullYear() + "-" + (nowDate.getMonth() + 1) + "-" + nowDate.getDate() + " 00:00:00'");
console.log(nowDate.toDateString());
<强>输出:强>
开始每日报道(&#39; 2016-6-30 00:00:00&#39;
2016年6月30日星期四