Здесь есть несколько вещей.Во-первых, чтобы получить количество дней между двумя датами намного эффективнее, чем уже предлагалось:
/*
Get the number of days between two dates - not inclusive.
"between" does not include the start date, so days
between Thursday and Friday is one, Thursday to Saturday
is two, and so on. Between Friday and the following Friday is 7.
e.g. getDaysBetweenDates( 22-Jul-2011, 29-jul-2011) => 7.
If want inclusive dates (e.g. leave from 1/1/2011 to 30/1/2011),
use date prior to start date (i.e. 31/12/2010 to 30/1/2011).
Only calculates whole days.
*/
function getDaysBetweenDates(d0, d1) {
var msPerDay = 8.64e7;
// Copy dates so don't mess them up
var x0 = new Date(d0);
var x1 = new Date(d1);
// Set to noon - avoid DST errors
x0.setHours(12,0,0);
x1.setHours(12,0,0);
// Round to remove daylight saving errors
return Math.round( (x1 - x0) / msPerDay );
}
Чтобы получить количество «рабочих» дней, определите количество целых недель, умножьте на 5, затемнастроить на оставшиеся дни и выходные в начале и в конце.Если вы хотите включить дату начала (типично для отпуска), используйте дату начала за один день до назначенной даты.например, заявление на отпуск с пн 4 июля 2011 года по пт 8 июля 2011 года составляет 5 дней отпуска.
С другой стороны, 5 рабочих дней с Пн 4 июля-2011 - это обычно следующий понедельник, 11 июля 2011 года, но может быть COB в пятницу 8 июля 2011 года.Правила для таких вещей могут быть разными в зависимости от местного обычая, юридического прецедента, договорного соглашения и т. Д.
Кроме того, такие простые алгоритмы в любом случае редко бывают достаточными.В праздничные дни все портится, как и в разные рабочие недели в разных местах.Некоторые из них с субботы по среду - четверг и пятница - выходные дни.В других местах суббота - рабочий день (6 дней в неделю).Кроме того, выходные дни могут приходиться на выходные дни.
/*
Simple algorithm: each week has 5 business days: Monday
to Friday inclusive. Saturday and Sunday are non-working
days.
*/
function getBusinessDaysBetweenDates(d0, d1) {
var days = getDaysBetweenDates(d0, d1);
var bWeeks = (days/7)|0;
var rDays = days%7;
var startDay = d0.getDay();
var endDay = d1.getDay();
// If not whole weeks, adjust for weekends
if (rDays) {
// Adjust for start on weekend, end any day
if (startDay == 6) {
rDays -= 1;
} else if(startDay == 5) {
rDays -= (rDays == 1)? 1 : 2;
// Adjust for start on business day
// and end on weekend
} else if (endDay == 6) {
rDays -= 1;
// Adjust for going over whole weekend
} else if (endDay < startDay) {
rDays -= (rDays == 1)? 1 : 2;
}
}
return bWeeks * 5 + rDays;
}
Если вы хотите включить праздничные дни, приходящиеся на дни с понедельника по пятницу, вам понадобится другая функция, которая использует календарь выходных дней и возвращаетмногие попадают в рабочие дни между тематическими датами.Также могут быть праздники для определенных отраслей, профессий, религий и т. Д.