2015-08-27 81 views
-1

之間我已經包含在我的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彷彿有假期的28-08- 2015年,因爲我在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已經是假期了。我想排除週末也

我該怎麼做?

+0

gon.holiday是一個數組還是一個普通的字符串? – Jaay

+0

@dinshaw raje:什麼是** dDate2 **和** dDate1 **?順便說一句,你可以通過使用循環與假期進行比較http://stackoverflow.com/questions/4428327/checking-if-two-dates-have-the-same-date-info,然後從** diffDays **中扣除它們 –

+0

它不是一個數組它取自己這個2015-08-28,2015-09-25,2016-08-31,2016-08-07,2015-08-13,2016-08-29,2016-01- 07,2015-09-08 – railslearner

回答

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

+0

我想排除週末 – railslearner

+0

更新了第二個例子。我以爲你已經這樣做 – mplungjan

+0

它不能正常工作 – railslearner

1

這可以相當容易地實現與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.

+0

它不按照我的要求工作我如果我的日期在「2015年8月27日」 - 「2015年8月31日」之間,那麼天數不同是5但我不想計算坐着和陽光,所以它仍然是3,但如果在28日(即8日)有其他假期,那麼它將不計算假期,我想要的輸出是2。 – railslearner

+0

@dinshawraje如果你想排除週末,你應該先寫下你的問題。 – Nit

+0

我在我的代碼,我取天已經提到,然後減去他們 – railslearner

0

呦ü可以計算天

再拆減去日子,通過這個數組來在gon.holiday到一個數組

然後循環日期的字符串,如果他們是兩個日期之間的天

function calculateDays(){ 
 
\t 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 
 
    \t 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>

相關問題