计算工作日 Jquery

发布于 2025-01-16 16:42:41 字数 1106 浏览 3 评论 0原文

我正在使用 jquery 和 moment js 来计算工作日。由于一些奇怪的原因,2022 年 12 月 31 日是星期六,但我的代码仍然将其显示为工作日。我的开始日期为 2022 年 12 月 30 日,1(一)个 workDaysToAdd 为 2022 年 12 月 31 日星期六,该日期不是工作日。我的代码不会跳过 2022 年 12 月 31 日星期六。

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;
}

I am using jquery and moment js to calculate Business Days. For some strange reasons 31 December 2022 is a Saturday but my code is still showing it as working day. I have a start Date of 30th December, 2022 and 1 (one) workDaysToAdd which falls on Saturday the 31st, December 2022 which is not working Business day. My code is not skipping the saturday 31st, December 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;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

思慕 2025-01-23 16:42:41

你的逻辑不正确。您从星期五开始,检查它是否是工作日(确实是)并递减 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.log("start", startDate);
console.info(AddBusinessDays(startDate, 1))

Your logic is incorrect. You start on a Friday and check if it's a workday (it is) and decrement workDaysToAdd. If that started as 1, it is now 0 and your while loop exits.

Move your date increment to the top of the loop so you're checking the next day.

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.log("start", startDate);
console.info(AddBusinessDays(startDate, 1))

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文