Я определил итератор для дней месяца плюс предикат для проверки, который не является концом недели.
Примечания
- Число месяцев начинается в 0. Итак, январь = 0. Я заставил итератор взять смещение номера месяца на единицу, сделав январь = 1.
- Дни недели. Итак, воскресенье = 0 и суббота = 6.
function isNotWeekEnd(date)
{
let dayOfTheWeek = date.getDay();
return dayOfTheWeek != 0 && dayOfTheWeek != 6;
}
function* daysOfTheMonth(year, month)
{
let monthEnd = new Date(year, month, 1);
let dayOfTheMonth = 1;
let dayStart = new Date(year, month - 1, dayOfTheMonth);
while(monthEnd - dayStart > 0)
{
yield dayStart;
dayOfTheMonth++;
dayStart = new Date(year, month - 1, dayOfTheMonth);
}
}
const workHoursPerDay = 7.6; // 7 hours plus 36 minutes
let nonWeekEnds = Array.from(daysOfTheMonth(2020, 1 /* January*/)).filter(isNotWeekEnd);
let workHours = nonWeekEnds.length * workHoursPerDay;
console.log({workHours});
Вывод:
{
"workHours": 174.79999999999998
}
Я должен быть в состоянии избежать объектов даты, объединив предикат в итераторе. На самом деле, мне не нужен итератор, просто количество дней.
const millisecondsPerSecond = 1000;
const secondsPerHour = 3600;
const hoursPerDay = 24;
const workHoursPerDay = 7.6; // 7 hours plus 36 minutes
const millisecondsPerDay = millisecondsPerSecond * secondsPerHour * hoursPerDay;
function daysInMonth(year, month)
{
let monthEnd = new Date(year, month, 1);
let monthStart = new Date(year, month - 1, 1);
let millisecondsInMonth = monthEnd - monthStart;
return millisecondsInMonth / millisecondsPerDay;
}
function notWeekEndsOfTheMonth(year, month)
{
const daysPerWeek = 7;
let daysOfTheMonth = daysInMonth(year, month);
let dayOfTheMonth = 1;
let dayStart = new Date(year, month - 1, dayOfTheMonth);
let dayOfTheWeek = dayStart.getDay();
let days = 0;
while(daysOfTheMonth >= dayOfTheMonth)
{
if (dayOfTheWeek != 0 && dayOfTheWeek != 6)
{
days++;
}
dayOfTheMonth++;
dayOfTheWeek = (dayOfTheWeek + 1) % daysPerWeek;
}
return days;
}
let workHours = notWeekEndsOfTheMonth(2020, 1 /* January */) * workHoursPerDay;
console.log({workHours});