Encontre a diferença do dia entre duas datas (excluindo os dias de fim de semana)

Oi eu estou usando jquery-ui datepicker para selecionar data e date.js para encontrar a diferença entre 2 datas.

Neste momento, o problema é que eu quero excluir os dias de fim de semana do cálculo (sábado e domingo). Como devo fazer isso?

Por exemplo, o usuário seleciona a data de início (13/8/2010) e a data final (16/8/2010). Desde 14/8/2010 e 15/8/2010 é em dias de semana, em vez de 4 dias no total, eu quero que seja apenas 2 dias.

Este é o código im usando agora:

 $("#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, "dmy"); var enddate1 = getDateFromFormat(d2, "dmy"); var days = 1 + Math.round((enddate1 - startdate1)/day); if(days>0) { $("#noofdays").val(days);} else { $("#noofdays").val(0);} });  

    Talvez alguém possa ajudá-lo a converter essa function no framework do JQuery …

    No javascript cru eu usarei:

    Demonstração ao vivo

      

    encontrado aqui

    e chamar essa function, por exemplo, algo como:

       

    ## EDITADO ##

    Se você quiser usá-lo com esse formato apenas:

    Seu código será parecido com:

      

    É assim que eu faria

     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")); 

    EDITAR
    Para esclarecer meu comentário para @keenebec …
    Essa solução funcionará para pequenas diferenças de data muito bem e é fácil de entender. Mas tome algo como “curto” como um período de 6 anos e você pode ver uma diferença notável na velocidade.

    http://jsfiddle.net/aSvxv/

    Eu incluí todas as 3 respostas e a resposta original é de fato a mais rápida, mas não muito e o trade off por alguns microssegundos de execução é um tanto trivial para mim em favor da legibilidade.

    Para fazer isso, você NÃO deve procurar todos os dias entre essas datas!

    Não é complicado, veja algumas suposições evidentes:

    1. Toda a semana completa tem 7 dias.

    2. Quais são 2 dias de fim de semana.

    3. E quais 5 são dias úteis.

    Conclusões evidentes:

    1. Olhe todos os dias é a perda de tempo.

    2. Verifique o que dia é fim de semana para toda a semana é a perda de tempo.


    Sem explicação tediosa .. deixe-me mostrar o código:

     function getBusinessDateCount (startDate, endDate) { var elapsed, daysBeforeFirstSaturday, daysAfterLastSunday; var ifThen = function (a, b, c) { return a == b ? c : a; }; elapsed = endDate - startDate; elapsed /= 86400000; daysBeforeFirstSunday = (7 - startDate.getDay()) % 7; daysAfterLastSunday = endDate.getDay(); elapsed -= (daysBeforeFirstSunday + daysAfterLastSunday); elapsed = (elapsed / 7) * 5; elapsed += ifThen(daysBeforeFirstSunday - 1, -1, 0) + ifThen(daysAfterLastSunday, 6, 5); return Math.ceil(elapsed); } var date1 = new Date(1999, 12, 31); var date2 = new Date(); // now print( getBusinessDateCount(date1, date2) ); 

    Você pode testá-lo sozinho com qualquer data.

    Eu só quero notar que este código consumia apenas 0,43 seg entre as datas de 2000 a 2015 … É muito mais rápido do que alguns outros códigos.

    Espero que ajude…

    Codificação legal !!

     Date.prototype.addDays = function(days) { var date = new Date(this.valueOf()) date.setDate(date.getDate() + days); return date; } function getBusinessDatesCount(startDate, endDate) { var count = 0; var curDate = startDate; while (curDate <= endDate) { var dayOfWeek = curDate.getDay(); var isWeekend = (dayOfWeek == 6) || (dayOfWeek == 0); if(!isWeekend) count++; curDate = curDate.addDays(1); } return count; } //Usage var startDate = new Date('7/16/2015'); var endDate = new Date('7/20/2015'); var numOfDays = getBusinessDatesCount(startDate,endDate); jQuery('div#result').text(numOfDays); 
      

    Isso parece muito trabalho para mim. Eu prefiro deixar o computador fazer o trabalho pesado //

     Date.bizdays= function(d1, d2){ var bd= 0, dd, incr=d1.getDate(); while(d1 

    Para entender o caminho.


    1. Dias reais = 14
    2. semanas para dias reais = 14/7 = 2
    3. Fins de semana por semana = 2
    4. Total de finais de semana = 2 * semanas para dias

    Então aplique isso,

      $('#EndDate').on('change', function () { var start = $('#StartDate').datepicker('getDate'); var end = $('#EndDate').datepicker('getDate'); if (start < end) { var days = (end - start) / 1000 / 60 / 60 / 24; var Weeks=Math.round(days)/7; var totalWeekends=Math.round(Weeks)*2; var puredays=Math.round(days)-totalWeekends; $('#days').text(Math.round(puredays) + "Working Days"); } else { alert(""); } 

    Obrigado !

    Eu trabalho com este código. Note que a function é de date.js e businessday js (graças a Garis Suero). Data de início 11-08-2010 Data final 16-08-2010 resultará em 4 dias de licença.

      

    O que eu fiz

     function calcbusinessdays() { for(var c=0,e=0,d=new Date($("#startdate").val()),a=(new Date($("#enddate").val())-d)/864E5;0<=a;a--) { var b=new Date(d); b.setDate(b.getDate()+a); 1==Math.ceil(b.getDay()%6/6)?c++:e++ } $("#noofdays").html(c) }; 

    c é dias de semana e é fins de semana

     function addDays(date, days) { var result = new Date(date); result.setDate(result.getDate() + days); return result; } var currentDate; selectFlixbleDates = []; var monToSatDateFilter=[]; currentDate=new Date(date); while(currentDate){ console.log("currentDate"+currentDate); if(new Date(currentDate).getDay()!=0){ selectFlixbleDates.push(currentDate) } if(selectFlixbleDates.length==$scope.numberOfDatePick) { break; } currentDate=addDays(currentDate,1); } for (var i = 0; i < selectFlixbleDates.length; i++) { // console.log(between[i]); monToSatDateFilter.push((selectFlixbleDates[i].getMonth() + 1) + '/' + selectFlixbleDates[i].getDate() + '/' + selectFlixbleDates[i].getFullYear()); } var endDate=monToSatDateFilter.slice(-1).pop(); var space =monToSatDateFilter.join(', '); var sdfs= document.getElementById("maxPicks").value =space; $scope.$apply(function() { $scope.orderEndDate=monToSatDateFilter.slice(-1).pop() $scope.orderStartDate=monToSatDateFilter[0]; }); document.getElementById("startDateEndDate").innerHTML =$scope.orderStartDate+ ' TO ' +$scope.orderEndDate }