I needed a really quick and dirty way to add business days to a date. We are currently using moment.js to handle our date functionality. Here is the script I used:
public addBusinessDays(date, daysToAdd) {
var cnt = 0;
var tmpDate = moment(date);
while (cnt < daysToAdd) {
tmpDate = tmpDate.add('days', 1);
if (tmpDate.weekday() != moment().day("Sunday").weekday() && tmpDate.weekday() != moment().day("Saturday").weekday()) {
cnt = cnt + 1;
}
}
return tmpDate;
}
Updated:
Here is another way to handle the same thing that works better for large numbers. Full credit for this code goes to leonardosantos, I am reposting it so that I have a copy.
https://github.com/leonardosantos/momentjs-business/blob/master/momentjs-business.js
/**
* momentjs-business.js
* businessDiff (mStartDate)
* businessAdd (numberOfDays)
*/
(function () {
var moment;
moment = (typeof require !== "undefined" && require !== null) &&
!require.amd ? require("moment") : this.moment;
moment.fn.businessDiff = function (start) {
start = moment(start);
var end = this.clone();
var start_offset = start.day() - 7;
var end_offset = end.day();
var end_sunday = end.clone().subtract('d', end_offset);
var start_sunday = start.clone().subtract('d', start_offset);
var weeks = end_sunday.diff(start_sunday, 'days') / 7;
start_offset = Math.abs(start_offset);
if(start_offset == 7)
start_offset = 5;
else if(start_offset == 1)
start_offset = 0;
else
start_offset -= 2;
if(end_offset == 6)
end_offset--;
return weeks * 5 + start_offset + end_offset;
};
moment.fn.businessAdd = function (days) {
var d = this.clone().add('d', Math.floor(days / 5) * 7);
var remaining = days % 5;
while(remaining){
d.add('d', 1);
if(d.day() !== 0 && d.day() !== 6)
remaining--;
}
return d;
};
}).call(this);
can u create function businessAdd without loop ?
Just with startOfWeek and add function in moment
LikeLike
Hi, I’m sure there is a much cleaner way to refactor this code. Many changes have been made to Moment.js since I first wrote this. 🙂
LikeLike
[…] are slightly modified from this post and I think are a good alternative to external library you have to carry/deal with (assuming this […]
LikeLike