2016-07-03 47 views
-1

我必須計算前一天從數據庫中選擇數據進行報告。它一直工作到2016年6月30日,但在7月1日失敗。 2016-06-30(一號)取得2016-05-31的日期。我的功能是使用節點調度名爲每天一次,看起來像這樣:在node.js中獲取以前的日期

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

作爲一個非常普通照會,日期和時區處理是一個痛苦的臀部,我通常會建議你使用像moment.js這樣的庫來避免處理它 –

回答

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")); 
} 

輸出:自從今天今天= 2016年2月7日
lessed2天

lessed1天=自今天= 30 2016年1月7日
lessed3天-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()); 

輸出:

開始每日報告( '2016年6月30日00:00:00'
星期四2016年6月30日

+0

是的,它也適用於現在運行此測試...也許這是因爲從日期和t oDate是全局聲明的,只有在啓動程序時纔會初始化? –

+0

@MarkusM - 好的我現在更好地理解了你的用例。如果這是一個長期運行的過程,也就是說,一旦啓動節點應用程序,您將保持運行狀態,直到機器關閉,這可能是一個問題。因爲一旦應用程序啓動,起始日期和結束日期將被初始化,並且您只是將今天的日數減到最小。我已經更新了我的解決方案,請查看。 –

+0

@MarkusM - 忘記提及。如果這對你有用,如果你可以通過點擊勾號將其標記爲答案,將不勝感激。這是爲了讓未來的讀者可以快速參考我們的解決方案,以便儘快進行修復。謝謝!另外,如果您仍然有麻煩,請隨時通知我。 –