2014-02-24 90 views
1

我有两个日期。一个是开始日期,另一个是结束日期。我想计算日期范围内有多少星期六,星期一和星期三?我该如何解决它?我看了几个教程,但他们只计算日期范围内的日期。提前致谢。我使用下面的代码来计算只有工作日,但我只需要在日期范围内有多少星期六,星期一和星期三。Javascript日期范围内有多少个特定日期

<!DOCTYPE html> 
<html> 
<head> 
<meta charset=utf-8 /> 
<title>JS Bin</title> 
<!--[if IE]> 
    <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> 
<![endif]--> 
    <script> 
     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 
    } 
    </script> 
<style> 
    article, aside, figure, footer, header, hgroup, 
    menu, nav, section { display: block; } 
</style> 
</head> 
<body> 
    <script> 
    alert(calcBusinessDays(new Date("August 01, 2010 11:13:00"),new Date("August 31, 2010 11:13:00"))); 
    </script> 
</body> 
</html> 
+0

你尝试过什么吗? –

+0

请提供您尝试展示一些功能的示例。我们在这里帮助您,而不是为您编写所有代码。谢谢 –

+0

如果你已经有单日期的范围,你可以迭代它们并筛选出你感兴趣的所有工作日。为了得到一周的某一天,你可以使用[Date.getDay()](http ://www.w3schools.com/jsref/jsref_getday.asp) – jhohlfeld

回答

2

我的方法:

首先,从范围内获得两个日期之间的日期列表:

function getDates(dateStart, dateEnd) { 
    var currentDate = dateStart, 
     dates = []; 
    while(currentDate <= dateEnd) { 

    // append date to array 
    dates.push(currentDate); 

    // add one day 
    // automatically rolling over to next month 
    var d = new Date(currentDate.valueOf()); 
    d.setDate(d.getDate() + 1); 
    currentDate = d; 

    } 
    return dates; 
} 

然后循环通过这些日期,筛选了相关工作一天指数:

function filterWeekDays(dates, includeDays) { 
    var weekdays = []; 

    // cycle dates 
    dates.forEach(function(day){ 

    // cycle days to be included (so==0, mo==1, etc.) 
    includeDays.forEach(function(include) { 
     if(day.getDay() == include) { 
     weekdays.push(day); 
     } 
    }); 
    }); 
    return weekdays; 
} 

过滤选项:

星期日beeing 0和周一是1,周日,周一的名单,周三将是:[0, 1, 3]

JS斌:http://jsbin.com/furupoqu/5/edit

+0

非常感谢。我检查了代码。它的工作正常。我认为只有一个问题。它不包括最后的日期。例如,如果结束日期在工作日内,则结果会比实际结果少返回1天。在2014年1月1日至2014年1月31日,如果工作日是星期六,星期一和星期三,那么结果将返回13个工作日,而如果我将2014年1月29日作为我的结束日期,也是星期三,则返回12个工作日,这应该是13。 – user3150647

+0

我改变了答案。看看while语句。它现在应该包含endDate。 – jhohlfeld

+0

这非常有用。是否有任何公式可以给出一组日期,这些日期将排除在两个日期之间或不计算在内? – Poonam

3

O(1)解决方案。一周中的几天(不超过7天),而不是日期范围。

// days is an array of weekdays: 0 is Sunday, ..., 6 is Saturday 
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); 
} 

例如,计数星期一(1),三(3)和星期六(6)中的2014年1月:

countCertainDays([1,3,6],new Date(2014,0,1),new Date(2014,0,1)) // 1 
countCertainDays([1,3,6],new Date(2014,0,1),new Date(2014,0,2)) // 1 
countCertainDays([1,3,6],new Date(2014,0,1),new Date(2014,0,3)) // 1 
countCertainDays([1,3,6],new Date(2014,0,1),new Date(2014,0,4)) // 2 
countCertainDays([1,3,6],new Date(2014,0,1),new Date(2014,0,5)) // 2 
countCertainDays([1,3,6],new Date(2014,0,1),new Date(2014,0,6)) // 3 
countCertainDays([1,3,6],new Date(2014,0,1),new Date(2014,0,7)) // 3 
countCertainDays([1,3,6],new Date(2014,0,1),new Date(2014,0,8)) // 4 
countCertainDays([1,3,6],new Date(2014,0,1),new Date(2014,0,9)) // 4 
countCertainDays([1,3,6],new Date(2014,0,1),new Date(2014,0,10)) // 4 
countCertainDays([1,3,6],new Date(2014,0,1),new Date(2014,0,11)) // 5 

注意:这假定d0d1Date对象,它们的时间的一天都差不多。如果仅创建年份,月份和日期来创建Date对象,则没有问题。