Search code examples
javascriptdateformulamomentjs

How to calculate Number of 'Working days' between two dates in Javascript using moment.js?


How to calculate the number of working days between two dates in JavaScript using moment.js. I have a working formula that calculate these days, but the formula does not satisfies all conditions:

here is my code:

var start= moment(data[x].start_date);
                var end= moment(data[x].est_end_date);
                var difference= end.diff(start, 'days');
                var workingDays= Math.round((difference/7)*5);
//data[x] is for iterating over a loop

I get five days per 7 days here because saturday and sunday are considered as NON-Working days, but this formula will fail if the count of the days were started from sunday or saturday.

Please any one could help in this regard that what necessary changes must be done in order to avoid this problem.


Solution

  • Just divide it into 3 parts.. first week, last week and the in between, something like this:

    function workday_count(start,end) {
      var first = start.clone().endOf('week'); // end of first week
      var last = end.clone().startOf('week'); // start of last week
      var days = last.diff(first,'days') * 5 / 7; // this will always multiply of 7
      var wfirst = first.day() - start.day(); // check first week
      if(start.day() == 0) --wfirst; // -1 if start with sunday 
      var wlast = end.day() - last.day(); // check last week
      if(end.day() == 6) --wlast; // -1 if end with saturday
      return wfirst + Math.floor(days) + wlast; // get the total
    } //              ^ EDIT: if days count less than 7 so no decimal point
    

    The test code

    var ftest = {date:'2015-02-0',start:1,end:7};
    var ltest = {date:'2015-02-2',start:2,end:8};
    var f = 'YYYY-MM-DD';
    for(var z=ftest.start; z<=ftest.end; ++z) {
      var start = moment(ftest.date + z);
      for(var y=ltest.start; y<=ltest.end; ++y) {
        var end = moment(ltest.date + y);
        var wd = workday_count(start,end);
        console.log('from: '+start.format(f),'to: '+end.format(f),'is '+wd+' workday(s)');
      }
    }
    

    Output of test code:

    from: 2015-02-01 to: 2015-02-22 is 15 workday(s)
    from: 2015-02-01 to: 2015-02-23 is 16 workday(s)
    from: 2015-02-01 to: 2015-02-24 is 17 workday(s)
    from: 2015-02-01 to: 2015-02-25 is 18 workday(s)
    from: 2015-02-01 to: 2015-02-26 is 19 workday(s)
    from: 2015-02-01 to: 2015-02-27 is 20 workday(s)
    from: 2015-02-01 to: 2015-02-28 is 20 workday(s)
    from: 2015-02-02 to: 2015-02-22 is 15 workday(s)
    from: 2015-02-02 to: 2015-02-23 is 16 workday(s)
    from: 2015-02-02 to: 2015-02-24 is 17 workday(s)
    from: 2015-02-02 to: 2015-02-25 is 18 workday(s)
    from: 2015-02-02 to: 2015-02-26 is 19 workday(s)
    from: 2015-02-02 to: 2015-02-27 is 20 workday(s)
    from: 2015-02-02 to: 2015-02-28 is 20 workday(s)
    from: 2015-02-03 to: 2015-02-22 is 14 workday(s)
    from: 2015-02-03 to: 2015-02-23 is 15 workday(s)
    from: 2015-02-03 to: 2015-02-24 is 16 workday(s)
    from: 2015-02-03 to: 2015-02-25 is 17 workday(s)
    from: 2015-02-03 to: 2015-02-26 is 18 workday(s)
    from: 2015-02-03 to: 2015-02-27 is 19 workday(s)
    from: 2015-02-03 to: 2015-02-28 is 19 workday(s)
    from: 2015-02-04 to: 2015-02-22 is 13 workday(s)
    from: 2015-02-04 to: 2015-02-23 is 14 workday(s)
    from: 2015-02-04 to: 2015-02-24 is 15 workday(s)
    from: 2015-02-04 to: 2015-02-25 is 16 workday(s)
    from: 2015-02-04 to: 2015-02-26 is 17 workday(s)
    from: 2015-02-04 to: 2015-02-27 is 18 workday(s)
    from: 2015-02-04 to: 2015-02-28 is 18 workday(s)
    from: 2015-02-05 to: 2015-02-22 is 12 workday(s)
    from: 2015-02-05 to: 2015-02-23 is 13 workday(s)
    from: 2015-02-05 to: 2015-02-24 is 14 workday(s)
    from: 2015-02-05 to: 2015-02-25 is 15 workday(s)
    from: 2015-02-05 to: 2015-02-26 is 16 workday(s)
    from: 2015-02-05 to: 2015-02-27 is 17 workday(s)
    from: 2015-02-05 to: 2015-02-28 is 17 workday(s)
    from: 2015-02-06 to: 2015-02-22 is 11 workday(s)
    from: 2015-02-06 to: 2015-02-23 is 12 workday(s)
    from: 2015-02-06 to: 2015-02-24 is 13 workday(s)
    from: 2015-02-06 to: 2015-02-25 is 14 workday(s)
    from: 2015-02-06 to: 2015-02-26 is 15 workday(s)
    from: 2015-02-06 to: 2015-02-27 is 16 workday(s)
    from: 2015-02-06 to: 2015-02-28 is 16 workday(s)
    from: 2015-02-07 to: 2015-02-22 is 10 workday(s)
    from: 2015-02-07 to: 2015-02-23 is 11 workday(s)
    from: 2015-02-07 to: 2015-02-24 is 12 workday(s)
    from: 2015-02-07 to: 2015-02-25 is 13 workday(s)
    from: 2015-02-07 to: 2015-02-26 is 14 workday(s)
    from: 2015-02-07 to: 2015-02-27 is 15 workday(s)
    from: 2015-02-07 to: 2015-02-28 is 15 workday(s)