Monday, June 3, 2024
 Popular · Latest · Hot · Upcoming
99
rated 0 times [  102] [ 3]  / answers: 1 / hits: 17134  / 11 Years ago, thu, january 23, 2014, 12:00:00

After revisiting this script, and some modifications, the following is available to allow a user to add a feature that calculates the expected delivery date.



// array of ISO YYYY-MM-DD format dates
publicHolidays = {
uk:[2020-01-01,2020-04-10,2020-04-13,2020-05-08,2020-05-25,
2020-08-03,2020-08-31,2020-12-25,2020-12-28],
usa:[2020-01-01,2020-01-20,2020-02-14,2020-02-17,2020-04-10,
2020-04-12,2020-05-10,2020-05-25,2020-06-21,2020-07-03,
2020-07-04,2020-09-07,2020-10-12,2020-10-31,2020,11,11,
2020-11-26,2020-12-25]
}
// check if there is a match in the array
Date.prototype.isPublicHoliday = function( data ){// we check for a public holiday
if(!data) return 1;
return data.indexOf(this.toISOString().slice(0,10))>-1? 0:1;
}

// calculation of business days
Date.prototype.businessDays = function( d, holidays ){
var holidays = holidays || false, t = new Date( this ); // copy date.
while( d ){ // we loop while d is not zero...
t.setDate( t.getDate() + 1 ); // set a date and test it
switch( t.getDay() ){ // switch is used to allow easier addition of other days of the week
case 0: case 6: break;// sunday & saturday
default: // check if we are a public holiday or not
d -= t.isPublicHoliday( holidays );
}
}
return t.toISOString().slice(0,10); // just the YYY-MM-DD
}

// dummy var, could be a form field input
OrderDate = 2020-02-12;
// test with a UK holiday date
var deliveryDate = new Date(OrderDate).businessDays(7, publicHolidays.usa);
// expected output 2020-02-25
console.log(Order date: %s, Delivery date: %s,OrderDate,deliveryDate );


Order date: 2020-02-12, Delivery date: 2020-02-25






The prototype is written to allow inputs from forms (HTML5 forms) of date type inputs as they are already in an ISO YYYY-MM-DD format and the output is formatted as such should that be needing to update a particular field.



The typical use would be...



var delDate = new Date( ISOdate ).businessDays( addBusinessDays, holidayData );


where the delDate is an ISO format date, eg, 2020-01-01


More From » javascript

 Answers
5

Thanks for your input guys, I had a long hard re-think over the approach I was making for this and came up with this little number...



var businessDays = 7, counter = 0; // set to 1 to count from next business day
while( businessDays>0 ){
var tmp = new Date();
var startDate = new Date();
tmp.setDate( startDate .getDate() + counter++ );
switch( tmp.getDay() ){
case 0: case 6: break;// sunday & saturday
default:
businessDays--;
};
}


The idea was to start with the business days and count backwards to zero for each day encountered that fell in to the range of a business day. This use of switch would enable a person to declare a day in the week as a non-business day, for example someone may not work on a monday, therefore the addition of case:1 would include a monday.



This is a simple script and does not take in to account public or bank holidays, that would be asking for a much more complex script to work with.



The result is a date that is set to the date of shipping, the user can then extract the date info in any format that they please, eg.



var shipDate = tmp.toUTCString().slice(1,15);

[#73001] Wednesday, January 22, 2014, 11 Years  [reply] [flag answer]
Only authorized users can answer the question. Please sign in first, or register a free account.
aliah

Total Points: 118
Total Questions: 132
Total Answers: 94

Location: Tajikistan
Member since Fri, Sep 11, 2020
4 Years ago
;