不计算两个日期之间的假期或周末

Do not count given holidays or weekends between two dates

本文关键字:之间 假期 周末 日期 两个 计算      更新时间:2023-09-26

我已经在我的js文件中包含了给定的代码

$( '.dateDisable' ).change(function() {
    calculateDays();
});
function calculateDays() {
  var first = new Date( $( '#start_date' ).val() ),
    last = new Date( $( '#end_date' ).val() ),
    daysDiff = leaveCalculation( first,last);  
}
function leaveCalculation( d1, d2 ) {
  alert(gon.holiday) // 2015-08-28,2015-09-25,2016-08-31,2016-08-07,2015-08-13,2016-08-29,2016-01-07,2015-09-08
  var weeks, dateDiff, weekDay1, weekDay2;
  if ( d2 < d1 ) return -1;
  weekDay1 = d1.getDay(),
    weekDay2 = d2.getDay();
  weeks = Math.floor( ( d2.getTime() - d1.getTime() ) / 604800000 );
  if ( weekDay1 <= weekDay2 )
    dateDiff = ( weeks * 5 ) + ( weekDay2 - weekDay1 );
  else
    dateDiff = ( ( weeks + 1 ) * 5 ) - ( weekDay1 - weekDay2 );
  return ( dateDiff + 1 );
}

我想计算天数。

如果我选择了日期" 2015年8月27日"-" 2015年8月31日"它将计算daysDiff = 3,但我想取出daysDiff,就好像在2015年8月28日有假期一样,因为我在gon.holiday中获取假期禁用日期。在我的例子中是

2015-08-28, 2015-09-25, 2016-08-31, 2016-08-07, 2015-08-13, 2016-08-29, 2016-01-07, 2015-09-08

因此,如果我选择了日期" 2015年8月27日"-" 2015年8月31日",那么它将给我daysDiff为2,因为28,29,30已经是假期了。我也想排除周末

我该怎么做呢?

像这样

var gon = {};
gon["holiday"] = "2015-08-28,2015-09-25,2016-08-31,2016-08-07,2015-08-13,2016-08-29,2016-01-07,2015-09-08".split(",");
// 2 helper functions - moment.js is 35K minified so overkill in my opinion
function pad(num) { return ("0" + num).slice(-2); }
function formatDate(date) { var d = new Date(date), dArr = [d.getFullYear(), pad(d.getMonth() + 1), pad(d.getDate())];return dArr.join('-');}
function calculateDays(first,last) {
  var aDay = 24 * 60 * 60 * 1000,
  daysDiff = parseInt((last.getTime()-first.getTime())/aDay,10)+1;
  if (daysDiff>0) {  
    for (var i = first.getTime(), lst = last.getTime(); i <= lst; i += aDay) {
      var d = new Date(i);
      if (d.getDay() == 6 || d.getDay() == 0 // weekend
      || gon.holiday.indexOf(formatDate(d)) != -1) {
          daysDiff--;
      }
    }
  }
  return daysDiff;
}
// ONLY using jQuery here because OP already used it. I use 1.11 so IE8+
$(function() {
    var days = calculateDays(new Date($('#start_date').val()),
                             new Date($('#end_date').val()));
    if (days <= 0) {
      alert("Please enter an end date after the begin date");
    }
    else {
      alert(days +" working days found");
    }
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input id="start_date" value="27 August, 2015" />
<input id="end_date" value="31 August, 2015" />

这可以很容易地通过Moment.js实现:

var startString = "2015-01-01";
var endString = "2015-02-20";
var holidaysString = "2015-01-03, 2015-01-15, 2015-02-05, 2015-03-01";
var start = moment(startString);
var end = moment(endString);
var holidays = holidaysString.split(',').map(function(str) {
  return moment(str);
});
var getDuration = function getDuration(start, end, holidays) {
  var overlappingDays = holidays.reduce(function(count, holiday) {
    return count + ~~(holiday.isAfter(start) && holiday.isBefore(end));
  }, 0);
  var diff = end.diff(start, 'days');
  return diff - overlappingDays;
};
output.innerHTML = getDuration(start, end, holidays);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.10.6/moment.min.js"></script>
<span id="output"></span> days.

你可以计算这些天之间的天数

然后将进入gon.holiday的日期字符串拆分为数组

然后循环遍历这个数组,如果它们在两个日期之间,则减去天数

function calculateDays(){
	var first = new Date( '27 August, 2015'),
    last = new Date('31 August, 2015'),
    daysDiff = leaveCalculation( first,last);
}
function leaveCalculation( d1, d2 ) {
  var holidayArr = [];
  var holiday = gon.holiday; //"2015-08-28,2015-09-25,2016-08-31,2016-08-07,2015-08-13,2016-08-29,2016-01-07,2015-09-08";
  if ( d2 < d1 ) return -1;
    
    var oneDay = 24*60*60*1000;
    var difDays = Math.round(Math.abs((d1.getTime() - d2.getTime())/(oneDay))); //find the number of days between the two dates
    var holidayArr = holiday.split(','); //split at ,
    for(var i=0; i<holidayArr.length;i++){ //loop through array
    	if(new Date(holidayArr[i]) <= d2 && new Date(holidayArr[i]) >= d1){ //check if two dates are between the given dates
            difDays-=1;
        }
    }
  return difDays;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>