Как рассчитать временные интервалы между двумя временными интервалами для расписания

#javascript #timetable #timeslots

#javascript #расписание #временные интервалы

Вопрос:

У меня есть время начала и время окончания в школе. и я хочу сгенерировать расписание для этой школы, используя время начала и время окончания и заданный временной интервал.

Время составляет 24 часа.

пример:-

 const startingTime = {
   startHour: 8,
   startMinutes: 30
}

const endTime = {
   endHour: 17,
   endMinutes: 30
}
  

А также я могу упомянуть временной интервал. существует два типа временных интервалов (1 час или 30 минут).

когда все эти параметры установлены, мне нужен массив со всеми временными интервалами между временем начала и временем окончания.

Я приведу простой пример

Время начала и окончания моей школы выглядит следующим образом,

 const startingTime = {
   startHour: 8,
   startMinutes: 30
}

const endTime = {
   endHour: 9,
   endMinutes: 30
}
  

ЕСЛИ временной интервал равен 1 часу

что мне нужно из этих данных,

8:30 — 9: 30

ЕСЛИ временной интервал равен 30 минутам

8:30 — 9:00

9:00 — 9:30

Другой пример

 const startingTime = {
   startHour: 8,
   startMinutes: 30
}

const endTime = {
   endHour: 2,
   endMinutes: 00
}
  

для такого сценария мы не можем использовать временной интервал в 1 час, потому что есть дополнительные 30 минут . итак, я уже проверил, только мы можем указать только 30-минутный временной интервал, поэтому в этом сценарии мы можем использовать только 30-минутный временной интервал.

ЕСЛИ временной интервал равен 30 минутам

8:30 — 9:00

9:00 — 9:30

9:30 — 10:00

10:00 — 10:30

10:30 — 11:00

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

Ответ №1:

Подумайте об использовании библиотеки дат и времени, такой как Luxon (https://moment.github.io/luxon/index.html )

 const slot = Duration.fromMillis(1800000) // 30:00 minutes

const period = {
    startTime: DateTime.local(2020, 1, 1, 8, 30),
    endTime: DateTime.local(2020, 1, 1, 10, 0)
}

var slots = [];
var slotCount = Math.trunc((period.endTime.toMillis() - period.startTime.toMillis()) / slot.milliseconds);
for (var i = 0; i < slotCount; i  ) {
    slots[i] = {
        startTime: period.startTime.plus(i * slot.milliseconds),
        endTime: period.startTime.plus((i   1) * slot.milliseconds)
    }
}

var formattedSlots = slots.map(x => ({
    startHour: x.startTime.hour, 
    startMinutes: x.startTime.minute,
    endHour: x.startTime.plus(slot).hour,
    endMinutes: x.startTime.plus(slot).minute,
}));

console.log(formattedSlots);
// Prints out:
// 0: {startHour: 8, startMinutes: 30, endHour: 9, endMinutes: 0}
// 1: {startHour: 9, startMinutes: 0, endHour: 9, endMinutes: 30}
// 2: {startHour: 9, startMinutes: 30, endHour: 10, endMinutes: 0}