【问题标题】:Do not count given holidays or weekends between two dates不要计算两个日期之间的给定假期或周末
【发布时间】:2015-08-27 09:09:29
【问题描述】:

我已经在我的 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已经放假了。我也想排除周末

我该怎么做?

【问题讨论】:

  • gon.holiday 是数组还是纯字符串?
  • @dinshaw raje:dDate2dDate1 是什么?顺便说一句,您可以使用循环与假期stackoverflow.com/questions/4428327/… 进行比较,然后从 diffDays 中减去它们
  • 它不是像这样简单地获取的数组 2015-08-28,2015-09-25,2016-08-31,2016-08-07,2015-08-13,2016-08 -29,2016-01-07,2015-09-08

标签: javascript jquery date datepicker


【解决方案1】:

像这样

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" />

【讨论】:

  • 我也想排除周末
  • 请查看更新。我替换了你的休假计算
【解决方案2】:

这可以通过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.

【讨论】:

  • 它不能按照我的要求工作,如果我的日期在“2015 年 8 月 27 日”-“2015 年 8 月 31 日”之间,那么天数不同的是 5,但我不想数坐sun 所以它仍然是 3 但如果 8 月 28 日(即星期五)还有其他假期,那么它将不计入假期,我想要的输出是 2。
  • @dinshawraje 如果你也想排除周末,你应该先在你的问题中写下来。
  • 我在我的代码中提到我正在获取天数,然后减去它们
  • 我不会说你的代码对初学者来说简单、易读或非常容易理解
  • @mplungjan 你到底遇到了什么困难?使用标准数组方法还是按位理解?
【解决方案3】:

你可以计算天之间的天数

然后将来自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;
}
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

【讨论】:

    猜你喜欢
    • 2020-08-21
    • 1970-01-01
    • 2011-04-17
    • 2017-01-28
    • 1970-01-01
    • 2015-04-25
    • 1970-01-01
    • 2016-01-17
    • 2019-04-15
    相关资源
    最近更新 更多