February 20, 2001 - Computing Business Days
February 20, 2001 Computing Business Days Tips: February 2001
Yehuda Shiran, Ph.D.
|
getDeliveryDateObj()
, accepts the number of business days as a parameter, and returns the delivery day's Date
object (national holidays are counted as business days):
function getDeliveryDateObj(businessDaysLeftForDelivery) {
var now = new Date();
var dayOfTheWeek = now.getDay();
var calendarDays = businessDaysLeftForDelivery;
var deliveryDay = dayOfTheWeek + businessDaysLeftForDelivery;
if (deliveryDay >= 6) {
//deduct this-week days
businessDaysLeftForDelivery -= 6 - dayOfTheWeek;
//count this coming weekend
calendarDays += 2;
//how many whole weeks?
deliveryWeeks = Math.floor(businessDaysLeftForDelivery / 5);
//two days per weekend per week
calendarDays += deliveryWeeks * 2;
}
now.setTime(now.getTime() + calendarDays * 24 * 60 * 60 * 1000);
return now;
}
The algorithm is to add the weekend days to the number of business days, yielding the target delivery date. The variable calendarDays
denotes the number of calendar days. We update it as we go along. The first line creates today's Date
object:
var now = new Date();
The second line computes today's day of the week (Sunday is 0, Saturday is 6):
var dayOfTheWeek = now.getDay();
We initialize calendarDays
with the number of business days accepted by the function as a parameter:
var calendarDays = businessDaysLeftForDelivery;
The target delivery day is:
var deliveryDay = dayOfTheWeek + businessDaysLeftForDelivery;
The next big loop handles cases where the delivery day is beyond Saturday:
if (deliveryDay >= 6) {
We first need to subtract the number of business days in the current week:
//deduct this-week days
businessDaysLeftForDelivery -= 6 - dayOfTheWeek;
Then we need to add this coming weekend to the number of calendar days:
//count this coming weekend
calendarDays += 2;
We compute the number of whole weeks before delivery:
//how many whole weeks?
deliveryWeeks = Math.floor(businessDaysLeftForDelivery / 5);
And add two days per weekend per week:
//two days per weekend per week
calendarDays += deliveryWeeks * 2;
At the exit of the loop, we just compute the delivery date by setting the Date
object's time. We need to convert the number of calendar days to milliseconds:
now.setTime(now.getTime() + calendarDays * 24 * 60 * 60 * 1000);
Click here to get the delivery date in 8 business days.