在NodeJS中迭代一系列date

我想遍历一系列的日历date,每个迭代是+1天。 我会使用Java中的JodaTime构build的东西 – 有没有类似的NodeJS?

您可以在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是一个比较stream行的库,有很多特性,但是我想知道哪一个更好? 也许你可以testing并让我们知道。 🙂

但是这些都没有JodaTime那么多。 为此,您需要一个在JavaScript中实现TZDB的库。 我在这里列出一些 。

另外,请注意一般JavaScriptdate的问题 。 这也影响NodeJS。

我会build议改变马特先前的回应。 他的代码会导致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')); } 

使用https://github.com/JerrySievert/node-date-utils框架,然后你可以像这样轻松地迭代&#xFF1A;

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

就像有很多这样的工具一样,将它们集成到一个有用的循环来检查数据可能会很麻烦。

这应该做的伎俩。 这可能是过度的,但你可以很容易地使这个更多的论据。

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