Vraag Zoek het dagverschil tussen twee datums (met uitzondering van weekenddagen)


Hallo, ik gebruik jquery-ui datepicker om datum en te selecteren date.js om het verschil tussen 2 datums te vinden.

Op dit moment is het probleem dat ik weekenddagen wil uitsluiten van berekening (zaterdag en zondag). Hoe moet ik dat doen?

Bijvoorbeeld de gebruiker selecteert startdatum (13/8/2010) en einddatum (16/8/2010). Aangezien 14/8/2010 en 15/8/2010 in weekdagen zijn, wil ik in plaats van 4 dagen totaal slechts 2 dagen zijn.

Dit is de code die ik nu gebruik:

<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 = 1 + Math.round((enddate1 - startdate1)/day);             

    if(days>0)
    { $("#noofdays").val(days);}
    else
    { $("#noofdays").val(0);}


    });

    </script>

13
2017-08-12 02:06


oorsprong


antwoorden:


Misschien kan iemand anders je helpen deze functie om te zetten in JQuery's framework ...

In raw javascript zal ik gebruiken:

Live demonstratie 

<script>
  function calcBusinessDays(dDate1, dDate2) { // input given as Date objects
    var iWeeks, iDateDiff, iAdjust = 0;
    if (dDate2 < dDate1) return -1; // error code if dates transposed
    var iWeekday1 = dDate1.getDay(); // day of week
    var iWeekday2 = dDate2.getDay();
    iWeekday1 = (iWeekday1 == 0) ? 7 : iWeekday1; // change Sunday from 0 to 7
    iWeekday2 = (iWeekday2 == 0) ? 7 : iWeekday2;
    if ((iWeekday1 > 5) && (iWeekday2 > 5)) iAdjust = 1; // adjustment if both days on weekend
    iWeekday1 = (iWeekday1 > 5) ? 5 : iWeekday1; // only count weekdays
    iWeekday2 = (iWeekday2 > 5) ? 5 : iWeekday2;

    // calculate differnece in weeks (1000mS * 60sec * 60min * 24hrs * 7 days = 604800000)
    iWeeks = Math.floor((dDate2.getTime() - dDate1.getTime()) / 604800000)

    if (iWeekday1 <= iWeekday2) {
      iDateDiff = (iWeeks * 5) + (iWeekday2 - iWeekday1)
    } else {
      iDateDiff = ((iWeeks + 1) * 5) - (iWeekday1 - iWeekday2)
    }

    iDateDiff -= iAdjust // take into account both days on weekend

    return (iDateDiff + 1); // add 1 because dates are inclusive
  }
</script>

gevonden hier

en om die functie te noemen, bijvoorbeeld, iets als:

  <script>
    alert(calcBusinessDays(new Date("August 11, 2010 11:13:00"),new Date("August 16, 2010 11:13:00")));
  </script>

## EDITED ##

Als je het wilt gebruiken met je dat formaat, gewoon:

Uw code zal er als volgt uitzien:

<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 newstartdate=new Date();
            newstartdate.setFullYear(startdate1.getYear(),startdate1.getMonth(),startdate1.getDay());
            var newenddate=new Date();
            newenddate.setFullYear(enddate1.getYear(),enddate1.getMonth(),enddate1.getDay());
            var days = calcBusinessDays(newstartdate,newenddate);
      if(days>0)
      { $("#noofdays").val(days);}
      else
      { $("#noofdays").val(0);}
    });

 </script>

18
2017-08-12 02:25



Dit is hoe ik het zou doen

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

BEWERK
Om mijn opmerking aan @keenebec te verduidelijken ...
Die oplossing zal voor kleine dataverschillen heel goed werken en is gemakkelijk te begrijpen. Maar neem iets als "kort" als een periode van 6 jaar en je ziet een opmerkelijk snelheidsverschil.

http://jsfiddle.net/aSvxv/

Ik heb alle 3 de antwoorden opgenomen en het oorspronkelijke antwoord is inderdaad het snelst, maar niet zozeer en de afweging voor een paar microseconden van uitvoering is enigszins triviaal voor mij ten gunste van de leesbaarheid.


9
2017-08-12 03:26



Om dit te doen, moet u NIET alle dagen tussen deze datums doorzoeken!

Het is niet ingewikkeld, kijk eens naar duidelijke aannames:

  1. De volledige week heeft 7 dagen.

  2. Welke 2 zijn weekenddagen.

  3. En welke 5 zijn werkdag.

Duidelijke conclusies:

  1. Kijk alle dagen is verlies van tijd.

  2. Controleer welke dag het weekend is om de hele week tijdverlies te doen.


Zonder saaie uitleg .. laat me de code zien:

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

U kunt het zelf testen met elke gewenste datum.

Ik wil dat gewoon opmerken deze code ALLEEN verbruikt 0,43 sec tussen de data van 2000 tot 2015 ... Het is veel sneller dan sommige andere codes.

Hoop dat het helpt...

Leuke codering !!


7
2018-04-29 13:33



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);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="result"/>


2
2018-04-29 12:04



Dat lijkt me teveel werk. Ik zou liever de computer het zware werk laten doen- //

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
2017-08-12 03:24



Om de manier te begrijpen.,


  1. Werkelijke dagen = 14
  2. weken voor Werkelijke dagen = 14/7 = 2
  3. Weekends per week = 2
  4. Totaal weekend = 2 * weken voor dagen

Dus gebruik dit,

 $('#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("");
}

Dank je !


1
2018-01-25 07:21



Ik laat het werken met deze code. Merk op dat de functie afkomstig is van date.js en werkdag js (dankzij Garis Suero). Startdatum 11-08-2010 Einddatum 16-08-2010 zal resulteren in 4 vakantiedagen.

<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
2017-08-12 03:21