将日期设置为从今天开始的7个工作日(不包括周末和公共假期) [英] Set date to 7 working days from today (excluding weekends and public holidays)

查看:147
本文介绍了将日期设置为从今天开始的7个工作日(不包括周末和公共假期)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm trying to set a date to 7 working days from today's date (excluding weekends and UK public holidays).

  1. 我首先将默认日期设置为今天的日期(todaysDate)+ 7天(todayPlusSevenDays)
  2. 然后,我计算今天Date& amp;之间的周末天数今天加上七天 如果找到任何内容,则将它们添加到todayPlusSevenDays
  3. 然后我检查是否有公共假期,如果有,我也将其添加
  1. I start by setting the default date to today's date (todaysDate) + 7 days (todayPlusSevenDays)
  2. Then I count the number of weekend days between todaysDate & todayPlusSevenDays If I find any I add them to todayPlusSevenDays
  3. Then I check for public holidays and if I find any I also add them

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

After performing those checks I have now added extra days to my default date - how can I also check if that new range of days contains weekend or public holidays?

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

For instance, if the default date becomes a weekend or bank holiday it should also add more days (right now it doesn't).

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

Here is my code so far: 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');
        }
    });
}

推荐答案

这里是@andi所说的例子.我把它作为计算器对象.

Here is an example of what @andi is talking about. I made it as a calculator object.

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个工作日(不包括周末和公共假期)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆