@JeyFom

Как рассчитать время смен на js?

Помогите, пожалуйста, написать функцию для расчета смен.
Точка отсчета - текущая дата, 00:00 часов, ее получаю с помощью moment().startOf('day'). Далее с бэка приходит начало и конец смены в виде "Start": 25200, "End": 68400 (в секундах, может быть отрицательным), которые необходимо прибавить к точке отсчета. Таким образом, получаю первую смену: 2020-08-07 07:00:00 - 2020-08-07 19:00:00. Помимо этого, с бэка приходит параметр "Amount", в котором указано, сколько смен должно быть рассчитано. Смены нужно упорядочить по убыванию дат.
Входные параметры:
Текущая дата:  2020-08-07 00:00:00,
Start: 07:00,
End: 19:00,
Amount: 5

Ожидаемый результат:
2020-08-07 07:00:00 - 2020-08-07 19:00:00
2020-08-06 19:00:00 - 2020-08-07 07:00:00
2020-08-06 07:00:00 - 2020-08-06 19:00:00
2020-08-05 19:00:00 - 2020-08-06 07:00:00
2020-08-05 07:00:00 - 2020-08-05 19:00:00
  • Вопрос задан
  • 232 просмотра
Решения вопроса 1
Aetae
@Aetae Куратор тега JavaScript
Тлен
Как-то так:
const today = moment().startOf('day');
const dateFormat = 'YYYY-MM-DD HH:mm:ss';
const mapFunc = ({ End, Start, Amount }) => {
  const points = [End, Start];
  const shift = moment(today).seconds(Start);
  const shifts = [];
  const order = Start > End;

  for (let i = 0; i < Amount; i++) {
    shifts.push(
      shift.format(dateFormat)
      + ' - '
      + shift
        .hours(0) // очищаем часы
        .minutes(0) // и минуты
        .seconds(points[i % 2]) // чередуем временную точку: чёт - End, нечёт - Start
        .add(i % 2 ^ order, 'd') // добавляем день если смена переходит на следующий
        .format(dateFormat)
    )
  }
  return shifts
}

console.log(mapFunc({
  "Start": 25200, 
  "End": 68400, 
  "Amount": 5
}));
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы