我想迭代一系列日历日期,每次迭代为+1天。我会在Java中使用JodaTime构建的东西 - 在NodeJS中有类似的东西吗?
答案 0 :(得分:98)
您可以在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是一个比较流行的图书馆,有很多功能,但我不知道哪一个表现更好?也许你可以测试并让我们知道。 :)
但这些都不如JodaTime那么多。为此,您需要一个在JavaScript中实现TZDB的库。我列出了some of those here。
另外,请注意problems with JavaScript dates。这也会影响NodeJS。
答案 1 :(得分:23)
我建议改变Matt先前的回应。他的代码会导致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(1, 'days')) {
console.log(m.format('YYYY-MM-DD'));
}
答案 2 :(得分: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"));
}
答案 3 :(得分: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;
}
答案 4 :(得分:0)
这是不带外部库的一种解决方案:
var start = new Date('October 1, 2020 03:00:00Z');
var now = new Date();
for (var d = start; d < now; d.setDate(d.getDate() + 1)) {
console.log(d);
}
结果:
2020-10-01T03:00:00.000Z 2020-10-02T03:00:00.000Z 2020-10-03T03:00:00.000Z 2020-10-04T03:00:00.000Z 2020-10-05T03:00:00.000Z 2020-10-06T03:00:00.000Z
第一个日期末的Z
用于UTC。如果需要时区,只需删除Z
。
答案 5 :(得分:0)
在 lodash 范围内使用 momentjs 的另一种方式:
let start = moment('2021-01-01');
let end = moment('2021-01-10');
_.range(b.diff(a, "d")).forEach((d) =>
console.log(moment(a).add(d, "d").format("YYYY/MM/DD"))
);
如果你不想使用 lodash,你可以得到一个如图所示的范围 here
[...Array(b.diff(a, "d")).keys()].forEach((d) =>
console.log(moment(a).add(d, "d").format("YYYY/MM/DD"))
);