2013-06-18 19 views

Antwort

67

Sie moment.js in einer node.js Anwendung verwenden können.

npm install moment 

Dann können Sie ganz einfach tun:

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

Hmmm ... das sieht viel wie der Code, den Sie bereits in Ihrer eigenen Antwort geschrieben. Moment.js ist eine beliebte Bibliothek mit vielen Funktionen, aber ich frage mich, welche besser funktioniert? Vielleicht können Sie testen und lassen Sie uns wissen. :)

Aber keiner von beiden macht so viel wie JodaTime. Dafür benötigen Sie eine Bibliothek, die die TZDB in JavaScript implementiert. Ich liste some of those here auf.

Achten Sie auch auf problems with JavaScript dates im Allgemeinen. Dies betrifft auch NodeJS.

+2

I zweiter Moment über Datum-utils – film42

+0

Danke für die Zeiger! – nwaltham

+0

im Moment 2,10 m.add (1, 'Tage') als Inkrementteil der for-Schleife. – avances123

1

Verwenden Sie den https://github.com/JerrySievert/node-date-utils Rahmen, dann können Sie leicht wie folgt durchlaufen:

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

Ich würde eine Änderung der früheren Antwort von Matt vorschlagen. Sein Code wird eine Mutation auf dem Objekt a verursachen. try this ...

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

Guter Fang verwenden! Das habe ich vermisst. –

0

So viel wie es viele Dienstprogramme für diese sind, könnten sie umständlich in eine sinnvolle Schleife integrieren gegen Daten zu überprüfen.

Dies sollte den Trick tun. Es könnte übertrieben sein, aber Sie könnten dies sehr leicht auf der Basis von Argumentation machen.

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