javascript - Hur delar man upp moment-datum i en array från tidslucka?


Jag har ett startDate och ett endDate och jag vill dela upp till en array av startDate och endDate? Min uppdelare är tidsluckor (inte ett nummer som i en paginering).

Min TypeScript-kod är:

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

Mitt startdatum är 2019-11-02T11:57:00.701Z och mitt slutdatum 2019-11-02T13:31:00.701Z

Jag letar efter hur man delar på och returnerar detta resultat:

[
  {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}
]

Svar #1

Använder moment-range plugin

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>

Relaterade artiklar