选择日期后添加天数,不包括周末和假日

时间:2012-03-02 12:45:12

标签: jquery jquery-ui datepicker

我有两个文本字段。在第一个文本字段中,我使用jQueryUI Datepicker添加了一个日历。当用户从日期选择器中选择日期时,它应该自动添加30天到日期并在第二个文本字段中设置该值。我有这个工作要添加30天的日期。

但是,它应排除周末和假日,仅显示30个工作日。我该怎么做?

if ($('#cat option:selected').text() == "ABC") {
    var date_billed = $('#datebilled').datepicker('getDate');
    var date_overdue = new Date();
    date_overdue.setDate(date_billed.getDate() + 30);
    date_overdue = $.datepicker.formatDate('mm/dd/yy', date_overdue);
    $('#datepd').val(date_overdue).prop('readonly', true);
}

更新:我添加了noWeekendsOrHolidays函数来禁用周末或假期。无论如何,我可以使用此功能来计算和添加工作日到该日期吗?

//holidays
            var natDays = [
              [7, 4, 'us']
            ];

            function noWeekendsOrHolidays(date) {
                var noWeekend = $.datepicker.noWeekends(date);
                if (noWeekend[0]) {
                    return nationalDays(date);
                } else { 
                    return noWeekend;
                }
            }
            function nationalDays(date) {
                for (i = 0; i < natDays.length; i++) {
                    if (date.getMonth() == natDays[i][0] - 1 && date.getDate() == natDays[i][1]) {
                        return [false, natDays[i][2] + '_day'];
                    }
                }
                return [true, ''];
            }

3 个答案:

答案 0 :(得分:4)

解决了!这个答案here帮了大忙。

代码:

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

    }


var date_billed = $('#datebilled').datepicker('getDate');
var date_overdue = new Date();
var weekDays = AddBusinessDays(30);
date_overdue.setDate(date_billed.getDate() + weekDays);
date_overdue = $.datepicker.formatDate('mm/dd/yy', date_overdue);
$('#datepd').val(date_overdue).prop('readonly', true);

答案 1 :(得分:2)

在处理假期时,实际上只有一种选择:一次一天。如果一天“计数”,您应该一次一天地迭代,并根据需要添加/减去。在伪代码中:

date add(date startDate, int daysToAdd) {
    int i:=0
    endDate:=startDate
    while (i<daysToAdd) {
        endDate++
        if (    NOT(isWeekend(endDate))
            AND NOT(isHoliday(endDate)) {
            i++
        }
    }
    return endDate
}

isWeekend()实施起来微不足道;另一方面,isHoliday()是一个非常难以破解的坚果。处理它的最简单方法是有一个已知假期表,并检查作为参数传递的日期是否与其中任何一个一致。在我看来,最好有一个基于规则的方法来计算给定日期是否是假日。

免责声明:我将之前的答案复制并粘贴到同一个问题中。见How to ignore weekends and holidays in boost date time?

答案 2 :(得分:2)

var numAdd = 30
var dataAvui = new Date()
for (var i=0;i<=numAdd;i++)
{ 
    var dataTemp = dataAvui
    console.dir(dataTemp.toString())
    dataTemp.setDate(dataTemp.getDate() + 1)
    if(dataTemp.getDay() == 6){
        dataTemp.setDate(dataTemp.getDate() + 2)
    }else if(dataTemp.getDay() == 0){
        dataTemp.setDate(dataTemp.getDate() + 1)
    }

    dataAvui = dataTemp
}
相关问题