2013-06-18 118 views

回答

67

您可以在Node.js應用程式使用moment.js

npm install moment 

然後,你可以很容易做到這一點:

var moment = require('moment'); 

var a = moment('2013-01-01'); 
var b = moment('2013-06-01'); 

// If you want an exclusive end date (half-open interval) 
for (var m = moment(a); m.isBefore(b); m.add(1, 'days')) { 
    console.log(m.format('YYYY-MM-DD')); 
} 

// If you want an inclusive end date (fully-closed interval) 
for (var m = moment(a); m.diff(b, 'days') <= 0; m.add(1, 'days')) { 
    console.log(m.format('YYYY-MM-DD')); 
} 

嗯...這看起來很像你在你自己的答案已經寫的代碼。 Moment.js是一個更受歡迎的圖書館,擁有大量的功能,但是我不知道哪一個更好?也許你可以測試並讓我們知道。 :)

但這些都不如喬達倍。爲此,您需要一個在JavaScript中實現TZDB的庫。我列出了some of those here。一般來說,請注意problems with JavaScript dates。這也會影響NodeJS。

+2

我第二次超過date-utils – film42

+0

感謝您的指點! – nwaltham

+0

時刻2.10 m.add(1,'days')作爲for循環的增量部分。 – avances123

1

使用https://github.com/JerrySievert/node-date-utils框架,那麼你就可以輕鬆地重複這樣的:

require('date-utils'); 

var d = new Date('2013-01-01'); 
var e = new Date('2013-06-01'); 

for(var i = d; i.isBefore(e); i.addDays(1)) { 
    console.log(i.toFormat("YYYY-MM-DD")); 
} 
19

我會建議改變馬特先前的迴應。他的代碼將在a對象上導致突變。試試這個...

var moment = require('moment'); 
var a = moment('2013-01-01'); 
var b = moment('2013-06-01'); 

for (var m = moment(a); m.isBefore(b); m.add('days', 1)) { 
    console.log(m.format('YYYY-MM-DD')); 
} 
+0

好抓!我錯過了。 –

0

儘管有很多這方面的實用程序,但它們可能會很麻煩,以便集成到有用的循環中以檢查數據。

這應該可以做到。這可能是矯枉過正,但你可以很容易地使這個更多的論據。

var moment = require('moment'); 
var _ = require('lodash'); 

function(collectionsWithDateValues){ 
    var slots = []; 
    var hours = { 
    start: 7, // 7am 
    end: 21, // 9pm 
    window: 2 // How long each item should be slotted for. 
    }; 
    var rightNow = moment().add(0, 'days').hours(hours.start).minute(0).second(0); 
    var cutoff = moment(rightNow).add(14,'days'); // Check the next 2 weeks. 
    for(rightNow ; rightNow.isBefore(cutoff) ; rightNow.add(hours.window, 'hours')){ 
    // Check if we're going beyond the daily cutoff, go to the next day 
    if(rightNow.isAfter(moment(rightNow).hour(hours.end))){ 
     rightNow.add(1, 'days').hour(hours.start); 
    } 
    var foundClash = false; 
    _.forEach(collectionsWithDateValues, function(item){ 
     // Check if the item is within now and the slotted time 
     foundClash = moment(item.date).isBetween(rightNow, moment(rightNow).add(hours.window, 'hours').subtract(1, 'minutes').seconds(59)); 
    }); 

    if(!foundClash){ 
     slots.push(rightNow.toString()); 
    } 
    } 
    return slots; 
}