工作日Javascript与额外日期

时间:2015-02-24 20:27:01

标签: javascript date

我有一个函数来计算传递的日期,并在结果中添加给定的天数,以确保输出的日期不会在周末出现。

功能

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.setDate(datStartDate.getDate() + new Number((~~((lngNumberOfWorkingDays + intOffset) / intWorkingDays) * intNonWorkingDays) + lngNumberOfWorkingDays + intModifier));
    return newDate;
}

我现在需要为此功能添加一些日期,以便将其考虑在内,这些是悉尼澳大利亚的公共假日。我希望实现的目标如下。

var newDate = addWorkingDays('30/09/2015', 3, false, false);

在此示例中,返回的日期将落在公共假日的03/10/2015上,因此我们需要返回04/10/2015

有问题的日期是:

01/01/2015 New Year's Day
26/01/2015 Australia Day
09/03/2015 Labour Day / Eight Hours Day / Adelaide Cup / Canberra Day
03/04/2015 Good Friday
06/04/2015 Easter Monday
25/04/2015 ANZAC Day
08/06/2015 Queen's Birthday
03/08/2015 Bank Holiday / Picnic Day
05/10/2015 Labour Day
03/11/2015 Melbourne Cup
25/12/2015 Christmas Day
26/12/2015 Boxing Day

鉴于上述功能,有人可以帮我修改功能以考虑这些日期。

1 个答案:

答案 0 :(得分:1)

因为当我尝试按照您指定的方式调用它时,您的代码会给我错误,但无论您是否应该只是检查您将作为答案提供的日期是否是您的无效日期之一,并且如果是,那么返回下一个工作日:

(伪代码)

newDate.setDate(datStartDate.getDate() + new Number((~~((lngNumberOfWorkingDays + intOffset) / intWorkingDays) * intNonWorkingDays) + lngNumberOfWorkingDays + intModifier));
if (newDate == "01/01/2015" || newDate == "26/01/2015" || ....) {
    return addWorkingDays(newDate, 1, blnIncSat, blnIncSun);
}
else {
    return newDate;
}