admin管理员组文章数量:1303327
I have two dates. One is starting date and another is ending date. I want to calculate how many Saturdays, Mondays and Wednesdays falls within the date range? How can I solve it? I saw several tutorial but they are only counting the dates within date range. Thanks in advance. I am using the following code to calculate only business days but I need only how many saturdays, mondays and wednesdays falls within the date range.
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>JS Bin</title>
<!--[if IE]>
<script src=".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>
I have two dates. One is starting date and another is ending date. I want to calculate how many Saturdays, Mondays and Wednesdays falls within the date range? How can I solve it? I saw several tutorial but they are only counting the dates within date range. Thanks in advance. I am using the following code to calculate only business days but I need only how many saturdays, mondays and wednesdays falls within the date range.
<!DOCTYPE html>
<html>
<head>
<meta charset=utf-8 />
<title>JS Bin</title>
<!--[if IE]>
<script src="http://html5shiv.googlecode./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>
Share
edited Feb 24, 2014 at 11:00
user3150647
asked Feb 24, 2014 at 10:35
user3150647user3150647
452 silver badges5 bronze badges
4
- Did you try anything? – Raja Asthana Commented Feb 24, 2014 at 10:36
- Please provide an example of something you've tried to show some effort. We are here to help and not write all the code for you. Thanks – Mark Walters Commented Feb 24, 2014 at 10:37
- If you already have the range in terms of single dates, you could iterate over them and filter out all the weekdays you are interested in. to get the day of a week, you can use Date.getDay() – Jakob Hohlfeld Commented Feb 24, 2014 at 10:51
- I have updated my question as you suggested. – user3150647 Commented Feb 24, 2014 at 11:01
2 Answers
Reset to default 8O(1) solution. Loops over days of the week (no more than 7), not the date range.
// 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);
}
For example, to count Mondays (1), Wednesdays (3) and Saturdays (6) in January of 2014:
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
Note: This assumes d0
and d1
are Date
objects whose time of day are about the same. If you create Date
objects only specifying year, month, and day, then there is no problem.
My approach:
First, acquire a list of dates from a range between two dates:
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;
}
Then cycle through those dates, filtering for a relevant work day index:
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;
}
Filtering options:
With Sunday beeing 0 and Monday being 1, a list of Sun, Mon, Wed would be: [0, 1, 3]
JS Bin: http://jsbin./furupoqu/5/edit
本文标签: timespanHow many specific days within a date range in JavascriptStack Overflow
版权声明:本文标题:timespan - How many specific days within a date range in Javascript - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741692457a2392810.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论