繁体   English   中英

将日期设置为从今天开始的7个工作日(不包括周末和公共假期)

[英]Set date to 7 working days from today (excluding weekends and public holidays)

我正在尝试将日期设置为从今天起的7个工作日(不包括周末和英国公共假期)。

  1. 首先,将默认日期设置为今天的日期(todaysDate)+ 7天(todayPlusSevenDays)
  2. 然后,我计算出TodaysDate和TodayPlusSevenDays之间的周末天数(如果有的话),将它们添加到todayPlusSevenDays中
  3. 然后,我检查是否有公共假期,如果有,我也会添加它们

执行完这些检查后,我现在在默认日期上增加了额外的天数-如何检查新的日期范围是否包含周末或公共假期?

例如,如果默认日期为周末或银行假日,则还应该增加更多天数(现在不是)。

到目前为止,这是我的代码: https : //jsfiddle.net/7yxna052/

function prepopulateDropdown() {
    var todaysDate = new Date(),
        tempNewDate = new Date(),
        todayPlusSevenDays,
        numberOfWeekends,
        todayPlusSevenDaysPlusWeekends,
        currentHour = todaysDate.getHours(),
        holidayCount = 0,
        weekendDayCount = 0,
        ukHolidays = ['2017-05-12','2017-05-29','2017-08-28','2017-12-25','2017-12-26'];

    // check if current time < or > 6pm GMT
    function setDefaultdDate(){
     if(currentHour >= 18){
           todayPlusSevenDays = new Date(tempNewDate.setDate(tempNewDate.getDate() + 7));
       }
       else{
           todayPlusSevenDays = new Date(tempNewDate.setDate(tempNewDate.getDate() + 6));
       }
    }
    setDefaultdDate();

    // Weekend day count
    function calculateWeekendDays(startDate, endDate){
        while(startDate < endDate){
            startDate.setDate(startDate.getDate() + 1);
            if(startDate.getDay() === 0 || startDate.getDay() == 6){
                ++weekendDayCount ;
            }
        }
        return weekendDayCount;
    }
    calculateWeekendDays(todaysDate, todayPlusSevenDays);

    todayPlusSevenDaysPlusWeekends = new Date(tempNewDate.setDate(tempNewDate.getDate() + weekendDayCount));



    // count UK bank holidays within todayPlusSevenDays
    function calculateBankHolidays(startDate, endDate){
      startDate.setHours(0,0,0,0);
      endDate.setHours(0,0,0,0);

      for(i=0; i < ukHolidays.length; i++){
        ukHolidaysFormated = new Date(ukHolidays[i]).setHours(0,0,0,0);
        d = new Date(ukHolidays[i]).getDay();

        if (ukHolidaysFormated >= startDate && ukHolidaysFormated <= endDate && !(d == 0 || d == 6)) {
           holidayCount++;
        }
      }
      return holidayCount;
    }
    calculateBankHolidays(todaysDate, todayPlusSevenDaysPlusWeekends);

    todayPlusSevenDaysPlusWeekends = new Date(todayPlusSevenDaysPlusWeekends.setDate(todayPlusSevenDaysPlusWeekends.getDate() + holidayCount));


    // set date to prepopulate
    var today = new Date();
    var year = todayPlusSevenDaysPlusWeekends.getFullYear();
    var month = '0' + (todayPlusSevenDaysPlusWeekends.getMonth() + 1);
    var day = todayPlusSevenDaysPlusWeekends.getDate();

    $('.slctDay option').each(function(){
        if($(this).val() == day){
            $(this).attr('selected','selected');
        }
    });
    $('.slctMonth option').each(function(){
        if($(this).val() == month){
            $(this).attr('selected','selected');
        }
    });
    $('.slctYear option').each(function(){
        if($(this).val() == year){
            $(this).attr('selected','selected');
        }
    });
}

一次检查一天,而不是7天范围。

首先将默认日期设置为今天的日期。 然后,一次检查一天。 如果该天是工作日,则将workingDay计数器加1。如果不是,则循环到第二天。 当WorkingDay计数器达到7时,这就是您需要的日期。

这是@andi所说的例子。 我将其作为计算器对象。

 var calculator = { workDaysAdded: 0, ukHolidays: ['2017-05-12','2017-05-29','2017-08-28','2017-12-25','2017-12-26'], startDate: null, curDate: null, addWorkDay: function() { this.curDate.setDate(this.curDate.getDate() + 1); if(this.ukHolidays.indexOf(this.formatDate(this.curDate)) === -1 && this.curDate.getDay() !== 0 && this.curDate.getDay() !== 6) { this.workDaysAdded++; } }, formatDate: function(date) { var day = date.getDate(), month = date.getMonth() + 1; month = month > 9 ? month : '0' + month; day = day > 9 ? day : '0' + day; return date.getFullYear() + '-' + month + '-' + day; }, getNewWorkDay: function(daysToAdd) { this.startDate = new Date(); this.curDate = new Date(); this.workDaysAdded = 0; while(this.workDaysAdded < daysToAdd) { this.addWorkDay(); } return this.curDate; } } var newWorkDay7 = calculator.getNewWorkDay(7); var newWorkDay9 = calculator.getNewWorkDay(9); var newWorkDay14 = calculator.getNewWorkDay(14); console.log(newWorkDay7); console.log(newWorkDay9); console.log(newWorkDay14); 

如果您只想添加7天,并且不包括节假日和周末(假设星期六和星期日),那么您可以从头到尾逐步进行测试,并每天进行测试:

 var ukHolidays = ['2017-05-12','2017-05-29','2017-08-28','2017-12-25','2017-12-26']; // Return date string in format YYYY-MM-DD function getISODate(date){ function z(n) {return (n<10?'0':'')+n} return date.getFullYear() + '-' + z(date.getMonth() + 1) + '-' + z(date.getDate()); } // Modifies date by adding 7 days, excluding sat, sun and UK holidays function add7WorkingDays(date) { for (var i=7; i; i--) { // Add a day date.setDate(date.getDate() + 1); // If a weekend or holiday, keep adding until not while(!(date.getDay()%6) || ukHolidays.indexOf(getISODate(date)) != -1) { date.setDate(date.getDate() + 1); } } return date; } // Add 7 working days to today var d = new Date(); console.log('Add 7 working days to ' + d.toString() + '\\nResult: ' + add7WorkingDays(d).toString()); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM