Найдите дневное различие между двумя датами (исключая дни выходных дней)

Привет я использую jquery-ui datepicker для выбора даты и date.js для нахождения различия между 2 датами.

Прямо сейчас проблема, я хочу исключить дни выходных дней из вычисления (в субботу и в воскресенье). Как я должен сделать это?

Например, пользователь выбирает дату начала (13/8/2010) и дата окончания (16/8/2010). С 14.08.2010 и 15.08.2010 находится в недельные дни вместо общего количества 4 дней, я хочу, чтобы это было только 2 днями.

Это - код, который я использую прямо сейчас:


17
задан cyberfly 12 August 2010 в 02:15
поделиться

4 ответа

Может быть, кто-нибудь еще может помочь вам преобразовать эту функцию в структуру 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 

## EDITED ##

Если вы хотите использовать его с вашим этим форматом, просто:

Ваш код будет выглядеть так:

 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);}}); 
     
20
ответ дан 30 November 2019 в 10:58
поделиться

Вот как я бы это сделал

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-летний промежуток, и вы увидите заметную разницу в скорости.

http://jsfiddle.net/aSvxv/

Я включил все 3 ответа, и оригинальный ответ действительно самый быстрый, но не намного, и компромисс между несколькими микросекундами выполнения для меня несколько тривиален в пользу удобочитаемости.

9
ответ дан 30 November 2019 в 10:58
поделиться

По-моему, это слишком много работы. Я бы лучше позволил компьютеру сделать всю работу... //

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))
1
ответ дан 30 November 2019 в 10:58
поделиться

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>
0
ответ дан 30 November 2019 в 10:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: