Вычисление количества временны́х промежутков в диапазоне

Приведу реальный пример, так как переводить это в "синтетику" - только путать.

Исходные данные

  1. В гостинице есть время завтрака - будние дни 06:00-10:00, выходные 07:00-11:00
  2. Время заезда и выезда гостей всегда считается от начала часа

Задача определения сколько раз гость может позавтракать за все время проживания.

Мое решение

У меня получилось сделать только "почасовым" перебором. Вот мой код:

function CountBreakfast(start, stop) {
  if (start >= stop) return 0;
  let hours = (stop-start)/3600000;
  let count = 0;           // количество подсчитанных завтраков
  let skip = false;        // подсчитали завтрак, ждем часа "незавтрака"?
  let holiday = false;     // для определения выходного дня
  
  for (let i=0; i<hours; i++) {
    let now = new Date(start.getTime()+(i*3600000));
    // определение выходного дня
    holiday = now.getDay() == 0 || now.getDay() == 6; 
    // определение попадания в диапазон завтрака
    let hour = now.getHours();
    let timeof = ( holiday && (hour >= 7) && (hour < 11)) ||
                 (!holiday && (hour >= 6) && (hour < 10));
    // подсчет завтрака
    if (skip && !timeof) {
      skip = false;
      continue;
    }
    if (!skip && timeof) {
      skip = true;
      count++;
    }
  }
  return count;
}

var start = new Date(2021,7,29,3);
var stop = new Date(2021,7,30,7);
var count = CountBreakfast(start,stop);
console.log('Завтраков: ' + count);

https://jsfiddle.net/stkgzy3e/

Вопросы

  1. Есть ли вариант это посчитать формулой, без перебора?
  2. А правильно ли я считаю?

Ответы (0 шт):