Add or subtract Business/Working DaysFunctions written for Javascript, PHP and Lasso 9 | |
   | 
I was lately looking for a working version of a function to add and/or subtract business days. The scripts and code I found via Google somehow did not produce the correct results all the time - and I do not mean the loops that simply add a day and check for weekends. Looping and adding a day each time is slow, so why slow down if you can use a formula. So I wrote my own functions, using some old code I had from back in 1989 and some new knowledge, for Javascript, PHP and Lasso 9. The three languages I now use for all my web developments.
Tweet

Javascript
function mv_addBusinessDays(p1, p2) {
	/*
		p1 = date string: 'YYYYMMDD'
		p2 = business days to add or subtract (-)
		returns date object
	*/
	aDate = new Date(p1.substr(0,4) + '-' + p1.substr(4,2) + '-' + p1.substr(6,2));
	if(!isNaN(parseInt(p1)) && parseInt(p1) != 0) {
		numWeeks = Math.floor(Math.abs(p2) / 5);
		numDays = (Math.abs(p2) % 5);
		dayOfWeek = aDate.getDay();	// Mo = 1, Su = 0
		if(dayOfWeek == 0) dayOfWeek = 7;	// Su
		// Correct for 1st whole week
		//  4 days = 0 weeks + 4 days
		//  5 days = 0 weeks + 5 days
		//  6 days = 1 week + 1 day
		// 10 days = 1 week + 5 days
		// 11 days = 2 weeks + 1 day
		if(numDays == 0) {
			numDays = 5;
			numWeeks -= 1;
		}
		if(parseInt(p2) < 0)
			numDays = numDays + ((dayOfWeek - numDays) < 1 ? 2 : 0) + (dayOfWeek > 5 ? dayOfWeek - 6 : 0);
		else if((dayOfWeek + numDays) > 5)
			numDays = (numDays + 2) - (dayOfWeek > 5 ? dayOfWeek - 5 : 0);
		numDays = (((numWeeks * 7) + numDays) * 1000 * 60 * 60 * 24);
		if(parseInt(p2) < 0)
			aDate.setTime(aDate.getTime() - numDays);
		else
			aDate.setTime(aDate.getTime() + numDays);
	}
	return(aDate);
}
PHP
<?php
function mv_addBusinessDays($p1, $p2)
{
	/*
		$p1 = date string: 'YYYYMMDD'
		$p2 = business days to add or subtract (-)
		returns date object
	*/
	$date = date_create_from_format('YmdHis', $p1 . '120000'));
	if((int) $p2 != 0) {
		$numWeeks = floor(abs($p2) / 5);
		$numDays = (int) (abs($p2) % 5);
		$dayOfWeek = (int) $date->format('N'); // 1 (Monday) .. 7 (Sunday)
		// Correct for 1st whole week
		//  4 days = 0 weeks + 4 days
		//  5 days = 0 weeks + 5 days
		//  6 days = 1 week + 1 day
		// 10 days = 1 week + 5 days
		// 11 days = 2 weeks + 1 day
		if($numDays == 0) {
			$numDays = 5;
			$numWeeks -= 1;
		}
		if((int) $p2 < 0) {
			$numDays = $numDays + (($dayOfWeek - $numDays) < 1 ? 2 : 0) + ($dayOfWeek > 5 ? $dayOfWeek - 6 : 0);
		}
		elseif(($dayOfWeek + $numDays) > 5) {
			$numDays = ($numDays + 2) - ($dayOfWeek > 5 ? $dayOfWeek - 5 : 0);
		}
		$interval = new DateInterval('P' . abs(($numWeeks * 7) + $numDays) . 'D');
		if((int) $p2 < 0)
			return($date->sub($interval));
		else
			return($date->add($interval));
	}
	else
		return($date);
}
?>
Lasso 9
[
define_tag('mv_addBusinessDays', -required='p1', -copy, -required='p2', -copy) => {
	/*
		p1 = date string: 'YYYYMMDD'
		p2 = business days to add or subtract (-)
		returns date string
	*/
	local(
		'date' = date(string(#p1) + '120000'),
		'numWeeks' = 0.0,
		'numDays' = 0,
		'dayOfWeek' = 0)
	if(integer(#p2) != 0) => {
		#numWeeks = math_floor(math_abs(#p2) / 5)
		#numDays = integer(math_abs(#p2) % 5)
		#dayOfWeek = (#date->dayofweek) - 1; // 2 (Monday) .. 1 (Sunday)
		if(#dayOfWeek == 0) => { #dayOfWeek = 7 }
		// Correct for 1st whole week
		//  4 days = 0 weeks + 4 days
		//  5 days = 0 weeks + 5 days
		//  6 days = 1 week + 1 day
		// 10 days = 1 week + 5 days
		// 11 days = 2 weeks + 1 day
		if(#numDays == 0) => {
			#numDays = 5;
			#numWeeks -= 1;
		}
		if(integer(#p2) < 0) => {
			#numDays = #numDays + ((#dayOfWeek - #numDays) < 1 ? 2 | 0) + (#dayOfWeek > 5 ? #dayOfWeek - 6 | 0)
		else((#dayOfWeek + #numDays) > 5)
			#numDays = (#numDays + 2) - (#dayOfWeek > 5 ? #dayOfWeek - 5 | 0)
		}
		#numDays += (#numWeeks * 7)
		if(integer(#p2) < 0) => {
			#date->subtract(-day=#numDays)
		else
			#date->add(-day=#numDays)
		}
	}
	
	return(#date);
}
]
Happy coding!

					


Transportation Administration System
Snoezelen Pillows for Dementia
Begeleiders voor gehandicapten
Laat uw hond het jaarlijkse vuurwerk overwinnen
Betuweroute en Kunst
Hey Vos! Je eigen naam@vos.net emailadres?
Kunst in huis? Nicole Karrèr maakt  echt bijzonder mooie dingen
Kunst in huis? Netty Franssen maakt  ook bijzonder mooie dingen