Подтвердить что ты не робот

Итерации через ряд дат в NodeJS

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

4b9b3361

Ответ 1

Вы можете использовать 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.

Ответ 2

Я бы предложил изменить предыдущий ответ Мэтта. Его код вызовет мутацию в объекте 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'));
}

Ответ 3

Используйте 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"));  
}

Ответ 4

Для этого существует много утилит, они могут быть громоздкими для интеграции в полезный цикл для проверки на данные.

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

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