Calculate specific days of the week between dates and exclude holidays in Javascript

Following 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 would also like to know how holidays can be excluded if they fall on a weekday in the range, assuming that I have an array of holidays between d0and d1.

Appreciate the help!

+4
source share
2 answers

As a result, I calculated the number of holidays falling on weekdays, and then distinguished them from the result created by the original function. This has the added benefit of allowing me to turn 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;
        }
0

script, , :

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);
+1

Source: https://habr.com/ru/post/1606062/


All Articles