Перебирать диапазон дат в NodeJS

Я хотел бы перебрать диапазон дат календаря, каждая итерация - +1 день. Я бы использовал что-то построенное вокруг JodaTime в Java - есть ли что-то похожее в NodeJS?

Ответы на вопрос(4)

цию на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'));
}
 ice.nicer23 окт. 2018 г., 16:37
@ парень прав ...
 Guy23 окт. 2018 г., 16:30
@oyalhivar m = a все равно будет иметь эффект мутированияa потому что они оба ссылаются на один и тот же объект момента. При выполненииvar m = moment(a) он генерирует новый моментный объект и присваивает егоm, который мутировал иa остается неизменной.
 oyalhi23 окт. 2018 г., 17:05
Я нене знаю, о чем я думал. Спасибо за разъяснения @Guy.
 Matt Johnson08 июл. 2014 г., 16:58
Хороший улов! Я пропустил это.
 oyalhi21 июл. 2018 г., 22:21
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 петля.

Использовать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"));  
}
Решение Вопроса

Ты можешь использоватьmoment.js в приложении 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'));
}

Хм ... это очень похоже на код, который вы уже написали в своем ответе. Moment.js - это более популярная библиотека, имеющая множество функций, но мне интересно, какая из них работает лучше? Возможно, вы можете проверить и дайте нам знать. :)

Но ни один из них не делает столько, сколько JodaTime. Для этого вам нужна библиотека, которая реализует TZDB в JavaScript. Я перечисляюнекоторые из тех, кто здесь.

Кроме того, следите запроблемы с датами JavaScript в общем. Это влияет и на NodeJS.

 Mateusz Rzepa12 мая 2016 г., 12:33
Отличный ответ! Имейте в виду, чем в новомmoment версию рекомендуется использоватьm.add(1, 'days') (заменить аргументы)Deprecation warning: moment().add(period, number) is deprecated. Please use moment().add(number, period).
 Matt Johnson12 мая 2016 г., 17:48
@MateuszRzepa - Обновлено. Благодарю.
 JohnnyQ08 авг. 2016 г., 16:42
Я столкнулся с этой проблемой, когда последний день диапазона нет включены я решил это с помощью этогоm.diff(b, 'days')
 avances12314 сент. 2015 г., 18:02
в момент 2,10 мин. (1, 'дней) как часть приращения для цикла.
 Mr. Muh18 дек. 2016 г., 15:35
Я столкнулся с проблемой при попытке выбрать опцию с m.diff: когда к вашей дате окончания добавлено время (в моем случае это было 3 часа дня), ваш цикл завершится еще на 1 день, так как последний m.diff не является полным день ... Так что будьте осторожны при преобразовании вашей даты в момент!
 Eddie14 июн. 2016 г., 11:50
var m = moment(a); может быть лучше здесь. Клонирование "а" оставит исходный объект даты без изменений.
 Daniel Khoroshko05 мая 2018 г., 12:45
m.isSameOrBefore также существует
 film4219 июн. 2013 г., 07:56
Я второй момент над свиданием
 mpen15 авг. 2017 г., 03:45
Если вы хотите включить последний день, вы можете использоватьm.isSameOrBefore(b)
 nwaltham21 июн. 2013 г., 10:31
Спасибо за указатели!

их может быть сложно интегрировать в полезный цикл для проверки данных.

Это должно сделать свое дело. Это может быть излишним, но вы можете очень легко сделать это более аргументированным.

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

Ваш ответ на вопрос