2013-06-18 20 views
26

Chciałbym iterować przez szereg dat kalendarzowych, każda iteracja jest +1 dzień. Chciałbym użyć czegoś zbudowanego wokół JodaTime w Javie - czy jest coś podobnego w NodeJS?Powtórzenie zakresu dat w NodeJS

Odpowiedz

67

Można użyć moment.js w node.js aplikacji.

npm install moment 

Następnie można bardzo łatwo to zrobić:

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 ... to wygląda jak kod, który już napisałem w swoim własnym odpowiedź. Moment.js jest popularniejszą biblioteką zawierającą mnóstwo funkcji, ale zastanawiam się, która z nich działa lepiej? Być może możesz przetestować i dać nam znać. :)

Ale żaden z nich nie robi tak dużo jak JodaTime. Do tego potrzebna jest biblioteka, która implementuje TZDB w JavaScript. Mam listę some of those here.

Pamiętaj też ogólnie o problems with JavaScript dates. Wpływa to również na NodeJS.

+2

I druga chwila nad datą-utils – film42

+0

Dzięki za wskazówki! – nwaltham

+0

w momencie 2.10 m.add (1, 'dni') jako przyrostowa część pętli for. – avances123

19

Proponuję zmianę wcześniejszej odpowiedzi udzielonej przez Matta. Jego kod spowoduje mutację na obiekcie a. spróbuj tego ...

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

Dobre złapanie! Tęsknie za tym. –

0

tyle, ile istnieje wiele narzędzi do tego, mogą być kłopotliwe do integracji użytecznym pętli sprawdzić przed danymi.

To powinno wystarczyć. Może to być przesada, ale możesz z łatwością uczynić to bardziej opartym na argumentach.

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; 
} 
Powiązane problemy