Как разделить даты моментов на массив из временного интервала? - PullRequest
4 голосов
/ 04 ноября 2019

У меня есть startDate и endDate, и я хочу разделить на массив startDate и endDate? Мой сплиттер - это временные интервалы (а не число, как в пагинации).

Мой машинописный код:

startDate: Date;
endDate: Date;
timeSlots: moment.Duration = moment.duration(30, 'minutes');

Моя начальная дата 2019-11-02T11:57:00.701Z и моя конечная дата 2019-11-02T13:31:00.701Z

Я ищу, как подобрать возвращаемый результат:

[
  {startDate: 2019-11-02T11:57:00.701Z, endDate: 2019-11-02T12:26:59.701Z}
  {startDate: 2019-11-02T12:27:00.701Z, endDate: 2019-11-02T12:56:59.701Z}
  {startDate: 2019-11-02T12:57:00.701Z, endDate: 2019-11-02T13:26:59.701Z}
  {startDate: 2019-11-02T13:27:00.701Z, endDate: 2019-11-02T13:31:00.701Z}
]

1 Ответ

3 голосов
/ 04 ноября 2019

Использование moment-range плагин

window['moment-range'].extendMoment(moment);

const start  = moment('2019-11-02T11:57:00.701Z');
const end    = moment('2019-11-02T13:31:00.701Z');
const range  = moment.range(start, end);

const rangeBy = range.by('minutes', { step: 30 });

const res = Array.from(rangeBy).map(m => ({
  'startTime': m.toISOString(),
  'endTime': m.add(29, 'm').add(59, 's').toISOString()
}))

if(moment(res[res.length -1].endTime).isAfter(end)) {
  res[res.length -1].endTime = end.toISOString();
}

console.log(res)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-range/4.0.1/moment-range.js"></script>
...