Вычисление количества временны́х промежутков в диапазоне
Приведу реальный пример, так как переводить это в "синтетику" - только путать.
Исходные данные
- В гостинице есть время завтрака - будние дни
06:00-10:00, выходные07:00-11:00 - Время заезда и выезда гостей всегда считается от начала часа
Задача определения сколько раз гость может позавтракать за все время проживания.
Мое решение
У меня получилось сделать только "почасовым" перебором. Вот мой код:
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/
Вопросы
- Есть ли вариант это посчитать формулой, без перебора?
- А правильно ли я считаю?