在Javascript中添加/减去工作日

Wil*_*ham 7 javascript date

我需要一个Date.prototype.addBusDays函数,它将整数作为要添加到日期的工作日数.

但是,有两个注意事项:1.周末,2.假期(我想这将是一个预设数组来比较.如果开始日期和结束日期包含3个假期,那么你将结束日期推出3)

我在网上遇到过一些剧本,我可以想到的一个难题是,让我们说你先解决所有周末,然后你做假期,如果你+1天(由于假期),你的结束日期被推入再过一个周末... <

有任何想法吗?谢谢!

编辑:

这是我正在开发的调度工具的一部分,这意味着日期将与链接在一起的任务相关联.向任务添加1天将触发重新计算与其关联的所有内容,可能是数据库中的所有日期.

小智 6

Datageek的解决方案对我有所帮助,但我需要对其进行补充.这仍然不是假期,但确实在工作日可以选择包括周六和/或太阳,并支持增加负面日期: -

function AddWorkingDays(datStartDate, lngNumberOfWorkingDays, blnIncSat, blnIncSun) {
    var intWorkingDays = 5;
    var intNonWorkingDays = 2;
    var intStartDay = datStartDate.getDay(); // 0=Sunday ... 6=Saturday
    var intOffset;
    var intModifier = 0;

    if (blnIncSat) { intWorkingDays++; intNonWorkingDays--; }
    if (blnIncSun) { intWorkingDays++; intNonWorkingDays--; }
    var newDate = new Date(datStartDate)
    if (lngNumberOfWorkingDays >= 0) {
        // Moving Forward
        if (!blnIncSat && blnIncSun) {
            intOffset = intStartDay;
        } else {
            intOffset = intStartDay - 1;
        }
        // Special start Saturday rule for 5 day week
        if (intStartDay == 6 && !blnIncSat && !blnIncSun) {
            intOffset -= 6;
            intModifier = 1;
        }
    } else {
        // Moving Backward
        if (blnIncSat && !blnIncSun) {
            intOffset = intStartDay - 6;
        } else {
            intOffset = intStartDay - 5;
        }
        // Special start Sunday rule for 5 day week
        if (intStartDay == 0 && !blnIncSat && !blnIncSun) {
            intOffset++;
            intModifier = 1;
        }
    }
    // ~~ is used to achieve integer division for both positive and negative numbers
    newDate.setTime(datStartDate.getTime() + (new Number((~~((lngNumberOfWorkingDays + intOffset) / intWorkingDays) * intNonWorkingDays) + lngNumberOfWorkingDays + intModifier)*86400000));
    return newDate;
}
Run Code Online (Sandbox Code Playgroud)


Dat*_*eek 4

看看下面的实现。来源自about.com

addWeekdays = function(date, dd) {
  var wks = Math.floor(dd/5);
  var dys = dd.mod(5);
  var dy = this.getDay();
  if (dy === 6 && dys > -1) {
     if (dys === 0) {dys-=2; dy+=2;}
     dys++; dy -= 6;
  }
  if (dy === 0 && dys < 1) {
    if (dys === 0) {dys+=2; dy-=2;}
    dys--; dy += 6;
  }
  if (dy + dys > 5) dys += 2;
  if (dy + dys < 1) dys -= 2;
  date.setDate(date.getDate()+wks*7+dys);
}

var date = new Date();
addWeekdays(date, 9);
Run Code Online (Sandbox Code Playgroud)