Рассчитать рабочие дни Jquery

Я использую 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;
}

какую версию mement и какие расширения моментов вы используете? также праздники отличаются от региона к региону, как вы справляетесь с этим

john Smith 22.03.2022 23:42
Как конвертировать HTML в PDF с помощью jsPDF
Как конвертировать HTML в PDF с помощью jsPDF
В этой статье мы рассмотрим, как конвертировать HTML в PDF с помощью jsPDF. Здесь мы узнаем, как конвертировать HTML в PDF с помощью javascript.
1
1
18
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша логика неверна. Вы начинаете в пятницу и проверяете, рабочий ли это день (так и есть) и уменьшаете 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))

Огромное спасибо. Это исправило мою проблему

Alex Aniapam 23.03.2022 12:11

Другие вопросы по теме