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