Массив дат с использованием Moment.js - PullRequest
1 голос
/ 01 июля 2019

Наша команда только начинает использовать moment.js для запросов даты и интересуется, есть ли функция, которая может создать массив дат, которые повторяются через x дней. Например, если начальная дата - 01.07.2009, а конечная дата - 30.06.2020, а интервал составляет 7 дней; есть ли функция момента, которая может создать массив дат, который выглядит следующим образом:

[7/8/2019,
7/15/2019,
7/22/2019,
7/29/2019,
8/5/2019,
...
6/29/2020]

Ответы [ 5 ]

1 голос
/ 01 июля 2019

Просто создайте функцию, которая будет принимать даты начала и окончания и интервал, и продолжайте добавлять в массив даты до даты.

const datesArray = (from, to, interval) => {
  let ret = [];
  const fromDate = moment(from, 'DD-MM-YYYY');
  const toDate = moment(to, 'DD-MM-YYYY');
  let date = fromDate.add(interval, 'days');
  while(toDate > date) {
    ret.push(date.format('MM-DD-YYYY'));
    date = moment(date).add(interval, 'days');
  }
  return ret;
}
1 голос
/ 01 июля 2019

Может быть, не конкретная функция момента, но, безусловно, момент обеспечивает все ингредиенты.Посмотрите на add () (для добавления 7 дней) и isBefore () (для даты окончания).

Я сделал фрагмент, который делает что-то близкое к тому, что вы спрашиваете:

var startDate = '2019-07-01';
var endDate = '2020-06-30'

var current = new moment(startDate);

var dates = [];

while (current.isBefore(endDate)) {
  dates.push(current.format('MM-DD-YYYY'));
  current.add(7, 'days');
}

console.log(dates)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.12.0/moment.js"></script>
1 голос
/ 01 июля 2019

Вы можете использовать for-of циклы и создавать массивы с функцией генератора.

function* dateRange(start, end, interval) {
  start = moment(start);
  end = moment(end);
  interval = moment.duration(interval);
  while (start.isBefore(end)) {
    yield start;
    start.add(interval);
  }
}

Использование:

const dates = [...dateRange(start, end, interval)];
for (date of dateRange(start, end, interval)) { /* ... */ }
0 голосов
/ 01 июля 2019

Создайте генератор, чтобы иметь гибкое решение:

/**
 * @param start: moment instance not included in result.
 * @param end: moment instance not included in result.
 * @param step: moment duration instance.
 * @return Generator for moment instances between start and end.
 */
function* generateMoments(start, end, step) {
  const variableMoment = start.clone();
  while(true) {
    variableMoment.add(step);
    if(variableMoment < end) {
      yield variableMoment.clone();
    } else {
      break;
    }
  }
}

И попросите список дат:

Array.from(
  generateMoments(moment('2019-07-01'), moment('2020-06-30'), moment.duration({ days: 7}))
).map(m => m.format(localeDependentFormat))
0 голосов
/ 01 июля 2019

Для этого вы можете использовать функцию добавления momentJS. Для примера

moment().add(7, 'days');

Вы можете просто выполнить цикл, добавив интервал к начальной дате. https://momentjs.com/docs/#/manipulating/add/

И еще один проект, который построен на основе моментов, будет https://github.com/rotaready/moment-range где вы можете напрямую получить диапазоны с интервалами. Но если это единственное требование, лучше пойти с простой функцией.

...