JSFiddle - React, Tailwind, and code Playground

by dain

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.24.0/moment-with-locales.min.js"></script>

JavaScript

moment.fn.addWorkdays = function (days) {
  // Getting negative / positive increment
  var increment = days / Math.abs(days);
  // Looping weeks for each full 5 workdays
  var date = this.clone().add(Math.floor(Math.abs(days) / 5) * 7 * increment, 'days');
  // Account for starting on Saturdays and Sundays
  if(date.isoWeekday() === 6) { date.add(-increment, 'days'); }
  else if(date.isoWeekday() === 7) { date.add(-2 * increment, 'days'); }
  // Adding / removing remaining days in a short loop, jumping over weekends
  var remaining = days % 5;
  while(remaining != 0) {
    date.add(increment, 'days');
    if(date.isoWeekday() !== 6 && date.isoWeekday() !== 7)
      remaining -= increment;
  }
  return date;
};

var today = moment();
console.log(today.addWorkdays(4).format('YYYY-MM-DD'));
console.log(today.addWorkdays(5).format('YYYY-MM-DD'));
console.log(today.addWorkdays(6).format('YYYY-MM-DD'));
console.log(today.addWorkdays(-5).format('YYYY-MM-DD'));
console.log(today.addWorkdays(-11).format('YYYY-MM-DD'));
console.log(today.addWorkdays(-1).format('YYYY-MM-DD'));