4

Following on from this question which calculates the number of specific weekdays in a given date range using this:

function countCertainDays( days, d0, d1 ) {
  var ndays = 1 + Math.round((d1-d0)/(24*3600*1000));
  var sum = function(a,b) {
      return a + Math.floor( ( ndays + (d0.getDay()+6-b) % 7 ) / 7 );
  };
  return days.reduce(sum,0);
}

I'd like to also know how holidays can be excluded if they fall on the weekday in the range, assuming I have an array of holidays occurring between d0 and d1.

Appreciate the help!

Community
  • 1
  • 1
qts
  • 984
  • 2
  • 14
  • 25

2 Answers2

1

some time ago i wrote similar script maybe it will help you:

var today = new Date();
var end = new Date(2016, 6, 1);
var allDays = Math.floor((end.getTime() - today.getTime())/ 86400000);
var holidays = [
    [15, 8],[1, 10],[17, 10],[29,9],[30,9],[23,11],[24,11],[25,11],[26,11],[27,11],[28,11],[29,11],[30,11],[31,11],[1,0],[2,0], [3,0],[4,0],[5,0],[6,0],[7,0],[1,1],[31,0],[22,1],[23,1],[24,1],[25,1],[26,1],[24,2],[25,2],[26,2],[27,2],[28,2],[29,2],[1,4],[8,4],
    ];

var days = 0;
    for(var i = 0; i < allDays; i++){
    var tmpDate = new Date();
    tmpDate.setTime(today.getTime() + i * 24*60*60*1000);
    var bool = true;
    for(var j = 0; j < holidays.length; j++){
        if( tmpDate.getDate() == holidays[j][0] && tmpDate.getMonth() == holidays[j][1] )
            bool = false;
    }
    if(tmpDate.getDay() != 0 && tmpDate.getDay() != 6 && bool)
        days++;
}
console.log(days);
Peter G
  • 155
  • 1
  • 8
0

I ended up calculating the number of holidays falling on weekdays and then differencing it from the result produced by the original function. This has the added advantage of allowing me to toggle the calculation on or off.

var holidays=[x,y,z] 
//where x,y and z are weekday numbers falling in the date range (obtained using something like .isBetween)
var desired_weekdays=[a,b]

var falling_on_weekdays= function(holidays,desired_weekdays){
    for (var i=0; i < holidays.length; i++) {
        if ($.inArray(holidays[i],desired_weekdays)==0){
            count++}
        }
    }
};

then:

if($('.#checkbox').prop("checked")===true){
            return days.reduce(sum,0);              
        }
        else {
            return days.reduce(sum,0)-falling_on_weekdays;
        }
qts
  • 984
  • 2
  • 14
  • 25