When determining the number of days between two dates, there are many decisions about what a day is. For example, the period from February 1 to February 2 is usually one day, so from February 1 to February 1, they are zero.
When adding the complexity of counting only business days, everything becomes much more complicated. For instance. Monday February 2, 2015 to Friday February 6 - 4 past days (Monday to Tuesday - 1, Monday to Wednesday - 2, etc.), However, the expression "Monday to Friday" is usually considered as 5 working days and duration Mon 2 February to Saturday 7 February should also be 4 business days, but from Sunday to Saturday should be 5.
So here is my algorithm:
- Get the total number of whole days between two dates
- Divide by 7 to get the number of whole weeks.
- Multiply the number of weeks by two to get the number of days off.
- Subtract the number of days off from the whole to get the working days.
- If the number of total days is not equal to the even number of weeks, add numbe weeks * 7 to the start date to get the temp date
- So far, the temp date is less than the end date:
- if the time is not Saturday or Sunday, add one business day
- add one to temp date
- What is it.
The step-by-step part at the end can probably be replaced by some other algorithm, but there will never be a cycle of more than 6 days, so this is a simple and reasonably effective solution to the problem of unequal weeks.
Some consequences of the above:
- Monday - Friday - 4 business days.
- Any day on the same day in another week is an even number of weeks and, therefore, an even choice of 5, for example. Monday from February 2 to Monday February 9 and Sunday from February 1 to Sunday February 8 - 5 business days.
- Friday from February 6 to Sunday February 7 are zero business days.
- Friday from February 6 to Monday February 9 - one business day.
- Sunday February 8th to Sunday February 15th, Saturday February 14th and Friday February 13th all 5 working days.
Here is the code:
// Expects start date to be before end date // start and end are Date objects function dateDifference(start, end) { // Copy date objects so don't modify originals var s = new Date(+start); var e = new Date(+end); // Set time to midday to avoid dalight saving and browser quirks s.setHours(12,0,0,0); e.setHours(12,0,0,0); // Get the difference in whole days var totalDays = Math.round((e - s) / 8.64e7); // Get the difference in whole weeks var wholeWeeks = totalDays / 7 | 0; // Estimate business days as number of whole weeks * 5 var days = wholeWeeks * 5; // If not even number of weeks, calc remaining weekend days if (totalDays % 7) { s.setDate(s.getDate() + wholeWeeks * 7); while (s < e) { s.setDate(s.getDate() + 1); // If day isn't a Sunday or Saturday, add to business days if (s.getDay() != 0 && s.getDay() != 6) { ++days; } } } return days; }
I donβt know how it compares with the jfriend00 answer or the code you referenced, if you want the period to be included, just add it if the start or end date is a business day.
source share