Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在NodeJS中遍历一系列日期_Node.js_Date_Datetime - Fatal编程技术网

Node.js 在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-

我想迭代一系列日历日期,每次迭代+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-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
循环。@oyalhi
var 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"))
);