Я использую jquery и moment js для расчета рабочих дней. По каким-то странным причинам 31 декабря 2022 года — суббота, но мой код по-прежнему показывает его как рабочий день. У меня есть дата начала 30 декабря 2022 года и 1 (один) workDaysToAdd, который приходится на субботу, 31 декабря 2022 года, которая не является рабочим рабочим днем. Мой код не пропускает субботу 31 декабря 2022 года.
function AddBusinessDays(startDate, workDaysToAdd) {
var curDate = new Date(startDate);
var realDaysToAdd = 0;
while (workDaysToAdd > 0) {
realDaysToAdd++;
if (IsWorkDay(curDate)) {
workDaysToAdd--;
}
curDate.setDate(curDate.getDate() + 1);
}
return realDaysToAdd;
}
function IsWorkDay(date) {
var curDate = new Date(date);
var dayOfWeek = curDate.getDay();
var isWorkDay;
if (dayOfWeek == 0 || dayOfWeek == 6) {
isWorkDay = false;
}
else {
isWorkDay = !isNationalDay(curDate);
}
return isWorkDay;
}
function isNationalDay(date) {
var thisDate = new Date(date);
var thisMoment = moment(thisDate);
var holiday = thisMoment.holiday();
var isHoliday = holiday != 'undefined' && holiday != null && holiday.length > 0;
return isHoliday;
}
Ваша логика неверна. Вы начинаете в пятницу и проверяете, рабочий ли это день (так и есть) и уменьшаете workDaysToAdd
. Если это началось как 1
, теперь это 0
, и ваш цикл while
завершается.
Переместите приращение даты в начало цикла, чтобы проверить день следующий.
function AddBusinessDays(startDate, workDaysToAdd) {
const curDate = new Date(startDate);
let realDaysToAdd = 0;
while (workDaysToAdd > 0) {
curDate.setDate(curDate.getDate() + 1); // move this to the top of the loop
realDaysToAdd++;
if (IsWorkDay(curDate)) {
workDaysToAdd--;
}
}
return realDaysToAdd;
}
function IsWorkDay(date) {
return date.getDay() % 6 && !isNationalDay(date);
}
function isNationalDay(date) {
return false; // no idea where the moment.holiday() comes from
}
const startDate = new Date(Date.UTC(2022, 11, 30));
console.info("start", startDate);
console.info(AddBusinessDays(startDate, 1))
Огромное спасибо. Это исправило мою проблему
какую версию mement и какие расширения моментов вы используете? также праздники отличаются от региона к региону, как вы справляетесь с этим