2014-01-28 87 views
1

我必须计算周末计数和假期计数在以下两个日期之间。周末,假期计数两个日期之间没有迭代

var startDate = new Date("01/02/2014"); 
     var endDate = new Date("02/06/2014"); 
     var holidays = [new Date("01/06/2014"), new Date("01/26/2014")]; 
+3

那么,什么是你的题? –

+1

检查出Momentjs(http://momentjs.com/)或Sugarjs(http://sugarjs.com/dates) – Jason

+0

没有迭代,你是不是从startDate迭代到endDate? –

回答

0
// Count days between the 2 dates 
var days = Math.floor(((Date.UTC(endDate.getFullYear(), endDate.getMonth(), endDate.getDate()) 
    - Date.UTC(startDate.getFullYear(), startDate.getMonth(), startDate.getDate()))/(24 * 60 * 60 * 1000))); 

// Count holidays 
var countHolidays = 0; 
for (var i = 0, len = holidays.length; i < len; ++i) 
    if (holidays[i] >= startDate && holidays[i] <= endDate) 
    ++countHolidays; 

// Vars used to count sundays and saturdays 
var adjustingDays1 = (7 - startDate.getDay()) % 7, // days between week of startDate and sunday 
    adjustingDays2 = (7 + 6 - startDate.getDay()) % 7, // days between week of startDate and saturday 
    oddDays = days % 7; // remainder of total days after dividing 7 
    completeWeeks = Math.floor(days/7); 

// Count weekend days 
var countWeekEndDays = completeWeeks + (oddDays >= adjustingDays1 ? 1 : 0) + 
      completeWeeks + (oddDays >= adjustingDays2 ? 1 : 0); 

console.log('holidays: ' + countHolidays); 
console.log('weekend days: ' + countWeekEndDays); 
+0

这可以返回'countWeekEndDays'的非整数值。例如:'Date(“2013/12/29”)'到'Date(“2014/01/21”)''。 –

+0

糟糕..我编辑了我的答案并添加了一个Math.floor。谢谢! – gtournie

1

这遍历一个完整的星期,所以最多有6次迭代。我想不出更纯粹的JS解决方案。

var startDate = new Date("01/02/2014"); 
var endDate = new Date("02/06/2014"); 

var diff = Math.abs(startDate - endDate); // in milliseconds 
var ms_per_day = 1000*60*60*24; 
var days = diff/ms_per_day + 1; // convert to days and add 1 for inclusive date range 
var mod = days % 7; 
var full_weeks = (days - mod)/7; 

var weekend_days = full_weeks * 2; 

if (mod != 0) { // iterate through remainder days 
    var startPartialWeek = new Date(); 
    var endPartialWeek = endDate; 
    startPartialWeek.setTime(endDate.getTime() - (mod - 1)*ms_per_day); 
    for (var d = startPartialWeek; d <= endPartialWeek; d.setDate(d.getDate() + 1)) { 
     if(d.getDay() == 0 || d.getDay() == 6) { 
      weekend_days++; 
     } 
    } 
} 

alert(weekend_days); 

这只计算星期六和星期日,而不是假期。我不认为你可以在没有迭代从其他来源获得的假期日期集合的情况下度假。

1

有以下两个功能:

function calculateTotalDays(firstDate, secondDate){ 
    var oneDay = 24*60*60*1000; // hours*minutes*seconds*milliseconds 
    var firstDate = new Date(2008,01,12); 
    var secondDate = new Date(2008,01,22); 

    var diffDays = Math.round(Math.abs((firstDate.getTime() - secondDate.getTime())/(oneDay))); 
    return diffDays; 
} 

function calcBusinessDays(dDate1, dDate2) { // input given as Date objects 
    var iWeeks, iDateDiff, iAdjust = 0; 
    if (dDate2 < dDate1) return -1; // error code if dates transposed 
    var iWeekday1 = dDate1.getDay(); // day of week 
    var iWeekday2 = dDate2.getDay(); 
    iWeekday1 = (iWeekday1 == 0) ? 7 : iWeekday1; // change Sunday from 0 to 7 
    iWeekday2 = (iWeekday2 == 0) ? 7 : iWeekday2; 
    if ((iWeekday1 > 5) && (iWeekday2 > 5)) iAdjust = 1; // adjustment if both days on weekend 
    iWeekday1 = (iWeekday1 > 5) ? 5 : iWeekday1; // only count weekdays 
    iWeekday2 = (iWeekday2 > 5) ? 5 : iWeekday2; 

    // calculate differnece in weeks (1000mS * 60sec * 60min * 24hrs * 7 days = 604800000) 
    iWeeks = Math.floor((dDate2.getTime() - dDate1.getTime())/604800000) 

    if (iWeekday1 <= iWeekday2) { 
     iDateDiff = (iWeeks * 5) + (iWeekday2 - iWeekday1) 
    } else { 
     iDateDiff = ((iWeeks + 1) * 5) - (iWeekday1 - iWeekday2) 
    } 

    iDateDiff -= iAdjust // take into account both days on weekend 

    return (iDateDiff + 1); // add 1 because dates are inclusive 
} 

可以计算总weekenddays如下:

var startDate = new Date("01/02/2014"); 
var endDate = new Date("02/06/2014"); 
var totalDays = calculateTotalDays(startDate, endDate); 
var weekendDays = totalDays - calcBusinessDays(startDate, endDate); 

再算上开始和结束日期之间的假期:

var totalHolidays = 0; 
for (var i = 0, i < holidays.length; i++){ 
    var d = holidays[i].getDay();//Make sure holiday is not a weekendday! 
    if (holidays[i] >= startDate && holidays[i] <= endDate && !(d == 0 || d==6)) 
    totalHolidays++; 
} 
+0

作为附加信息calcBusinessDays是从这个[页面]的功能(http://stackoverflow.com/questions/3464268/find-day-difference-between-two-dates-excluding-weekend-days)!我没有自己写! –

+0

如果开始日是“星期日”,最后一个是“星期五”,则此操作失败。它只计算1天。例如,从2015年1月18日到2015年1月23日。[这是错误的再现](http://jsfiddle.net/e6gmkLwg/) – Alvaro

相关问题