Я пытаюсь создать метод для расчета общего количества выходных.
У меня есть массив, содержащий рабочие дни:
"рабочие дни": [1,2,3,4,5],
Итак, у меня есть две даты; a startDate и endDate, и я должен посчитать в этом диапазоне, сколько дней нерабочие (т.е. общее количество выходных).
Например, у меня диапазон с 15.03 (сегодня) по 21.03, итого 7 дней.
Сегодня (15.03) день 2, и это рабочий день, поэтому мне не нужно увеличивать счетчик выходных дней, а например 19.03 не рабочий день (это номер 6), поэтому у меня есть для увеличения переменной выходного дня.
Я попытался реализовать код, но он работает неправильно:
const checkDate = (start, end) => {
const workingDays = [1,2,3,4,5]
let dayOff = 0
var currentDate = new Date(start)
while (currentDate <= end) {
workingDays.map((day) => {
console.info('current ', currentDate.getDay(), ' day ', day)
if (currentDate.getDay() !== day) {
dayOff += 1
}
currentDate = currentDate.addDays(1)
})
}
console.info('dayOff ', dayOff)
return dayOff
}
он печатает меня:
LOG current 2 day 1
LOG current 3 day 2
LOG current 4 day 3
LOG current 5 day 4
LOG current 6 day 5
LOG current 0 day 1
LOG current 1 day 2
LOG current 2 day 3
LOG current 3 day 4
LOG current 4 day 5
LOG dayOff 10
но это неправильно, потому что результат должен быть 2.
Как я могу сделать? Спасибо
РЕДАКТИРОВАТЬ.
Функция, которую я использую для добавления дня:
Date.prototype.addDays = function (days) {
var date = new Date(this.valueOf())
date.setDate(date.getDate() + days)
return date
}
У вас есть мой голос за вопрос.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


currentDate = currentDate.addDays(1)
.addDays не является правильной функцией Javascript. Он используется в С#.
Ниже приведен правильный код, который вернет правильный ответ:
const workingDays = [1,2,3,4,5]
const endDate = new Date(startDate)
let dayOff = []
var currentDate = new Date(endDate)
while (currentDate <= endDate) {
console.info('currentDate', currentDate)
let index = workingDays.indexOf(currentDate.getDay());
console.info('dayOff - index', index)
if (index == -1)
{
console.info('dayOffDate - addded', currentDate)
dayOff.push(currentDate)
}
currentDate = new Date(currentDate.setDate(currentDate.getDate() + 1))
}
вы даже можете сослаться на stackoverflow.com/questions/563406/как добавить дни до даты
Я забыл вставить функцию, которую я использую для добавления дня
хорошо, позвольте мне проверить это еще раз
Хорошо, спасибо, мне нужно проверить каждую дату в диапазоне с каждым элементом в массиве, пока я проверяю дату с первым элементом, если они не равны, я проверяю день + 1 со вторым элементом массива ( пока я должен сравниваться со вторым элементом массива)
Да, точно. это сработает.
Я обновил свой исходный ответ
@AjayPatel, в целом, лучше использовать версии UTC методов Date(), чтобы избежать ошибок из-за разницы во времени / поясе.
@MohsenAlyafei Я думаю, я не думаю, что это нужно для клиентской стороны, но вы работаете с другим часовым поясом, тогда да
Следующая небольшая функция рассчитает общее количество выходных дней между двумя (2) датами, учитывая первую дату и дату окончания.
Это просто и предполагает, что дата окончания совпадает с датой начала или выше (не проверяет изменение дат).
function getTotalOffDays(start,end) {
const workingDays = [1,2,3,4,5];
let daysOff = 0, // days off counter
date = new Date(start), // starting date
endDate = new Date(end); // end date
while (date <= endDate) {
if (!workingDays.includes(date.getUTCDay())) daysOff += 1; // increment days off
date = new Date(date.setUTCDate(date.getUTCDate() + 1)); // go the next day
}
return daysOff;
}
console.info("Total days off: " + getTotalOffDays("2022-03-15", "2022-03-21"));
Используйте
date = new Date(date.setUTCDate(date.getUTCDate() + 1));, чтобы увеличить дату. Смотрите мой ответ ниже. Надеюсь, это поможет вам.