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

标签 javascript jquery

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

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

另外例如,如果今天是 10/12/2015 30 天后是 11/11/2015,这是退伍军人节,这个函数应该知道这一天是假期,然后将其设置为 11/12/2015 永远不允许它也将在周末。没有周末没有列出假期 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

关于javascript - 显示从现在起 30 天后的日期,只有第 30 天检测是否是周末或假期是否正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33530154/

相关文章:

javascript - 循环遍历表并将特定单元格存储在数组中(如果选中行)

javascript - Codeigniter 3 - Ajax 文件上传(您没有选择要上传的文件)

javascript - JavaScript 上的 ESLint 错误 (Unexpected token ...) 简化为字典

javascript - 离线网页 javascript sleep() 或 wait() 函数

php - 插件在激活期间生成了意外输出的 xxx 个字符

Javascript Json 内部循环

javascript - 带有 javascript onclick 的多个 DOM 操作函数

javascript - 限制固定子 div 的高度滚动到父 div 的高度

javascript - 在 iOS 中使用 Javascript 复制到剪贴板

javascript - Safari 11 在 Web 检查器上调试时崩溃