显示从现在起30天的日期,只有第30天检测是否为正确日期的周末或假日

Display date 30 days from now having only the 30th day detect if its a weekend or holiday for correct day

本文关键字:30天 日期 周末 是否 假日 从现在起 显示 检测      更新时间:2023-09-26

我正在尝试创建一个排除周末和节假日的函数。我正试图在30天后的文本框中显示。一旦30天循环,请检查该天,并确保它不是假日(如果是),请选择下一个可用的日期。出于某种原因,我想出的这个包括了所有的假期,所以它给了我一个截止到今天的12/21的日期。当我想要的最终结果是12/04。有人能告诉我如何相应地调整吗?

http://jsfiddle.net/byyeh83t/9/

例如,如果今天是2015年12月10日,30天后是2015年11月11日,也就是退伍军人日,该功能应该知道这一天是假日,然后将其定为2015年12日11日,而不允许它在周末。没有列出周末和节假日http://jsfiddle.net/byyeh83t/13/

HTML

<input name="workExemptDays" id="workExemptDays" type="text"/>

JS

$(document).ready(function() {
    //Testing purposes
    var natDays = [
        [2014, 1, 1, 'New Year'], 
        [2014, 1, 20, 'Martin Luther King'], 
        [2014, 2, 17, 'Washingtons Birthday'],       
        [2014, 5, 26, 'Memorial Day'], 
        [2014, 7, 4, 'Independence Day'], 
        [2014, 9, 1, 'Labour Day'], 
        [2014, 10, 13, 'Columbus Day'], 
        [2014, 11, 11, 'Veterans Day'], 
        [2014, 11, 27, 'Thanksgiving Day'], 
        [2014, 11, 28, 'Thanksgiving Day'],
        [2014, 12, 25, 'Christmas'],  
        [2014, 12, 26, 'Christmas'], 
        [2015, 1, 1, 'New Year'], 
        [2015, 1, 19, 'Martin Luther King'], 
        [2015, 2, 16, 'Washingtons Birthday'],       
        [2015, 5, 25, 'Memorial Day'], 
        [2015, 7, 3, 'Independence Day'], 
        [2015, 9, 7, 'Labour Day'], 
        [2015, 10, 12, 'Columbus Day'], 
        [2015, 11, 11, 'Veterans Day'], 
        [2015, 11, 26, 'Thanksgiving Day'], 
        [2015, 11, 27, 'Thanksgiving Day'],
        [2015, 12, 24, 'Christmas'],  
        [2015, 12, 25, 'Christmas']  
        ];

// dateMin is the minimum delivery date
var dateMin = new Date();

function AddBusinessDays(curdate, weekDaysToAdd) {
    var date = new Date(curdate.getTime());
    while (weekDaysToAdd > 0) {
        date.setDate(date.getDate() + 1);
        //check if current day is business day
        if (noWeekendsOrHolidays(date)[0]) {
            weekDaysToAdd--;
        }
    }
    return date;
}

function noWeekendsOrHolidays(date) {
    var noWeekend = $.datepicker.noWeekends(date);
    return (noWeekend[0] ? nationalDays(date) : noWeekend);
}

function nationalDays(date) {
    for (i = 0; i < natDays.length; i++) {
        if (date.getFullYear() == natDays[i][0] && date.getMonth() == natDays[i][1] - 1 && date.getDate() == natDays[i][2]) {
        return [false, natDays[i][3] + '_day'];
        }
    }
    return [true, ''];
}

function setDeliveryDate(date) {
    $('#workExemptDays').val($.datepicker.formatDate('mm/dd/yy', date));
}

setDeliveryDate(AddBusinessDays(dateMin, 30));
});

基本上,从现在起30天的显示日期只有第30天,如何检测它是周末还是假期,以确保它是有效的一天。

问题是,从现在到接下来的30天,你每天都在检查,看看每一天是周末还是假期。如果一天是周末或假日,你就要取消一天。所以基本上你增加了30个工作日。

要获得30天后的第一个非周末或假期,你需要做的是从30天开始添加,然后从该日期开始检查,并不断递增1,直到你发现一天不是周末或假期。

AddBusinessDays函数更改为以下内容:-

function AddBusinessDays(curdate, weekDaysToAdd) {
    var date = new Date((new Date()).setDate(curdate.getDate() + weekDaysToAdd));
    while (!noWeekendsOrHolidays(date)) {
        date.setDate(date.getDate() + 1);
    }
    return date;
}

Fiddle