How to exclude weekends between two dates using Moment.js

Here you go!

function addWeekdays(date, days) {
  date = moment(date); // use a clone
  while (days > 0) {
    date = date.add(1, 'days');
    // decrease "days" only if it's a weekday.
    if (date.isoWeekday() !== 6 && date.isoWeekday() !== 7) {
      days -= 1;
    }
  }
  return date;
}

You call it like this

var date = addWeekdays(moment(), 5);

I used .isoWeekday instead of .weekday because it doesn't depend on the locale (.weekday(0) can be either Monday or Sunday).

Don't subtract weekdays, i.e addWeekdays(moment(), -3) otherwise this simple function will loop forever!

Updated JSFiddle http://jsfiddle.net/Xt2e6/39/ (using different momentjs cdn)


Those iteration looped solutions would not fit my needs. They were too slow for large numbers. So I made my own version:

https://github.com/leonardosantos/momentjs-business

Hope you find it useful.


https://github.com/andruhon/moment-weekday-calc plugin for momentJS might be helpful for similar tasks

It does not solves the exact problem, but it is able to calculate specific weekdays in the range.

Usage:

moment().isoWeekdayCalc({  
  rangeStart: '1 Apr 2015',  
  rangeEnd: '31 Mar 2016',  
  weekdays: [1,2,3,4,5], //weekdays Mon to Fri
  exclusions: ['6 Apr 2015','7 Apr 2015']  //public holidays
}) //returns 260 (260 workdays excluding two public holidays)

If you want a pure JavaScript version (not relying on Moment.js) try this...

function addWeekdays(date, days) {
    date.setDate(date.getDate());
    var counter = 0;
        if(days > 0 ){
            while (counter < days) {
                date.setDate(date.getDate() + 1 ); // Add a day to get the date tomorrow
                var check = date.getDay(); // turns the date into a number (0 to 6)
                    if (check == 0 || check == 6) {
                        // Do nothing it's the weekend (0=Sun & 6=Sat)
                    }
                    else{
                        counter++;  // It's a weekday so increase the counter
                    }
            }
        }
    return date;
}

You call it like this...

var date = addWeekdays(new Date(), 3);

This function checks each next day to see if it falls on a Saturday (day 6) or Sunday (day 0). If true, the counter is not increased yet the date is increased. This script is fine for small date increments like a month or less.