在node.js

时间:2016-07-03 07:56:11

标签: node.js date

我必须计算前一天从数据库中选择数据进行报告。它工作到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'

知道为什么我前一天的计算失败了吗?

1 个答案:

答案 0 :(得分:0)

问题在于fromDatetoDate被声明为全局变量。这些日期将初始化为应用程序运行的日期,并且在您的循环中,您尝试从该应用程序首次启动的日期时间减去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日星期四