我有两个约会。一个是开始日期,另一个是结束日期。我想计算星期六,星期一和星期三在日期范围内的数量?我该如何解决?我看了几个教程,但他们只计算日期范围内的日期。提前致谢。我使用以下代码仅计算工作日,但我只需要星期六,星期一和星期三的数量在日期范围内。
<!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 :(得分:6)
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);
}
例如,计算2014年1月的星期一(1),星期三(3)和星期六(6):
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
注意:这假定d0
和d1
是Date
个对象,其时间大致相同。如果您创建仅指定年,月和日的Date
个对象,则没有问题。
答案 1 :(得分:4)
我的方法:
首先,从两个日期之间的范围中获取日期列表:
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;
}
过滤选项:
星期日为0,星期一为1,太阳,星期一,星期三的清单为:[0, 1, 3]