Добавить дни после выбора даты, исключая выходные и праздничные дни - PullRequest
3 голосов
/ 02 марта 2012

У меня есть два текстовых поля. В первом текстовом поле я добавил календарь с помощью 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 ]

4 голосов
/ 03 марта 2012

Решено! Этот ответ здесь очень помог.

Код:

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);
2 голосов
/ 09 января 2014
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
}
2 голосов
/ 02 марта 2012

Когда дело касается праздников, на самом деле есть только один вариант: один день за один раз. Вы должны выполнять итерацию, один день за раз, и добавлять / вычитать по мере необходимости, если день «считается». В псевдокоде:

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(), с другой стороны, очень крепкий орешек. Самый простой способ справиться с этим - иметь таблицу известных праздников и проверить, совпадает ли дата, переданная в качестве параметра, с любым из них. На мой взгляд, лучше иметь метод, основанный на правилах, который может вычислить, является ли данная дата праздником или нет.

Отказ от ответственности: я скопировал и вставил это из моего предыдущего ответа на тот же вопрос. См. Как игнорировать выходные и праздничные дни во время повышения даты?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...