Node.js 在NodeJS中遍历一系列日期
我想迭代一系列日历日期,每次迭代+1天。我会使用Java中围绕JodaTime构建的东西-NodeJS中是否有类似的东西?使用该框架,然后您可以像这样轻松地进行迭代:Node.js 在NodeJS中遍历一系列日期,node.js,date,datetime,Node.js,Date,Datetime,我想迭代一系列日历日期,每次迭代+1天。我会使用Java中围绕JodaTime构建的东西-NodeJS中是否有类似的东西?使用该框架,然后您可以像这样轻松地进行迭代: 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-
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"));
}
您可以在node.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'));
}
var-moment=require('moment');
var a=力矩('2013-01-01');
var b=力矩('2013-06-01');
//如果您想要独占的结束日期(半开放时间间隔)
对于(var m=力矩(a);m.isBefore(b);m.add(1,'天')){
console.log(m.format('YYYY-MM-DD'));
}
//如果需要包含的结束日期(完全关闭间隔)
对于(var m=moment(a);m.diff(b,'days'),我建议更改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'));
}
尽管有许多实用程序可以实现这一点,但将它们集成到一个有用的循环中以检查数据可能会很麻烦
这应该可以做到。这可能有点过头了,但你可以很容易地让它更具争议性
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;
}
这里有一个没有外部库的解决方案:
var start=新日期('2020年10月1日03:00:00Z');
var now=新日期();
for(var d=start;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
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
另一种使用momentjs和lodash range的方法:
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,可以获得如图所示的范围
我在moment 2.10 m.add(1,'days')中使用了超过日期的秒矩。这是一个很好的答案!请记住,在新的moment
版本中,建议使用m.add(1,'days')
(替换参数)弃用警告:moment()。add(句点,数字)已弃用。请使用moment().add(数字,句点).
我遇到了一个问题,没有包括范围的最后一天,我用这个m.diff(b,'days')解决了这个问题如果你想包括最后一天,你可以在(b)
var a=moment('2013-01-01');所以a
已经是moment
,不需要var m=moment(a)
应该是:for(var m=a;m.isBefore(b);m.add(1,'days'))
。另外,我想我更喜欢while
而不是建议的for
循环。@oyalhivar m=a
仍然会有变异a
的效果,因为它们都指向同一个力矩对象。通过执行var m=moment(a)
它生成一个新的力矩对象,并将其分配给m
,该对象发生了变异,a
保持不变。我不知道我在想什么。谢谢@Guy的澄清。
[...Array(b.diff(a, "d")).keys()].forEach((d) =>
console.log(moment(a).add(d, "d").format("YYYY/MM/DD"))
);