Привет я использую jquery-ui datepicker для выбора даты и date.js для нахождения различия между 2 датами.
Прямо сейчас проблема, я хочу исключить дни выходных дней из вычисления (в субботу и в воскресенье). Как я должен сделать это?
Например, пользователь выбирает дату начала (13/8/2010) и дата окончания (16/8/2010). С 14.08.2010 и 15.08.2010 находится в недельные дни вместо общего количества 4 дней, я хочу, чтобы это было только 2 днями.
Это - код, который я использую прямо сейчас:
Может быть, кто-нибудь еще может помочь вам преобразовать эту функцию в структуру JQuery ...
Я нашел эту функцию здесь .
function calcBusinessDays (dDate1, dDate2) {// ввод задан как объекты Date var iWeeks, iDateDiff, iAdjust = 0; если (dDate2 5) && (iWeekday2> 5)) iAdjust = 1; // корректировка, если оба дня в выходные iWeekday1 = (iWeekday1> 5)? 5: iWeekday1; // считать только будние дни iWeekday2 = (iWeekday2> 5)? 5: iWeekday2; // вычислить разницу в неделях (1000 мс * 60 с * 60 мин * 24 часа * 7 дней = 604800000) iWeeks = Math.floor ((dDate2.getTime () - dDate1.getTime ()) / 604800000) if (iWeekday1
Если вы хотите использовать его с вашим этим форматом, просто:
Ваш код будет выглядеть так:
function calcBusinessDays (dDate1, dDate2) {// ввод задан как объекты Date var iWeeks, iDateDiff, iAdjust = 0; если (dDate2 5) && (iWeekday2> 5)) iAdjust = 1; // корректировка, если оба дня в выходные iWeekday1 = (iWeekday1> 5)? 5: iWeekday1; // считать только будние дни iWeekday2 = (iWeekday2> 5)? 5: iWeekday2; // вычислить разницу в неделях (1000 мс * 60 с * 60 мин * 24 часа * 7 дней = 604800000) iWeeks = Math.floor ((dDate2.getTime () - dDate1.getTime ()) / 604800000) if (iWeekday1 0) {$ ("# noofdays"). val (days);} else {$ ("# noofdays"). val ( 0);}});
Вот как я бы это сделал
function getDays(d1, d2) {
var one_day=1000*60*60*24;
var d1_days = parseInt(d1.getTime()/one_day) - 1;
var d2_days = parseInt(d2.getTime()/one_day);
var days = (d2_days - d1_days);
var weeks = (d2_days - d1_days) / 7;
var day1 = d1.getDay();
var day2 = d2.getDay();
if (day1 == 0) {
days--;
} else if (day1 == 6) {
days-=2;
}
if (day2 == 0) {
days-=2;
} else if (day2 == 6) {
days--;
}
days -= parseInt(weeks) * 2;
alert(days);
}
getDays(new Date("June 8, 2004"),new Date("February 6, 2010"));
EDIT
Чтобы уточнить мой комментарий к @keenebec...
Это решение будет работать для небольшой разницы дат довольно хорошо и легко понять. Но возьмите что-то такое "короткое", как 6-летний промежуток, и вы увидите заметную разницу в скорости.
Я включил все 3 ответа, и оригинальный ответ действительно самый быстрый, но не намного, и компромисс между несколькими микросекундами выполнения для меня несколько тривиален в пользу удобочитаемости.
По-моему, это слишком много работы. Я бы лучше позволил компьютеру сделать всю работу... //
Date.bizdays= function(d1, d2){
var bd= 0, dd, incr=d1.getDate();
while(d1<d2){
d1.setDate(++incr);
dd= d1.getDay();
if(dd%6)++bd;
}
return bd;
}
//test
var day1= new Date(2010, 7, 11), day2= new Date(2010, 7, 31);
alert(Date.bizdays(day1, day2))
I заставить его работать с этим кодом. Обратите внимание, что функция взята из date.js и businessday js (спасибо Гарису Суеро). Дата начала 11-08-2010 Дата окончания 16-08-2010 приведет к 4-дневному отпуску.
<script type="text/javascript">
$("#startdate, #enddate").change(function() {
var d1 = $("#startdate").val();
var d2 = $("#enddate").val();
var minutes = 1000*60;
var hours = minutes*60;
var day = hours*24;
var startdate1 = getDateFromFormat(d1, "d-m-y");
var enddate1 = getDateFromFormat(d2, "d-m-y");
var days = calcBusinessDays(new Date(startdate1),new Date(enddate1));
if(days>0)
{ $("#noofdays").val(days);}
else
{ $("#noofdays").val(0);}
});
</script>