#native_company# #native_desc#
#native_cta#

Calculate difference in dates, using only workdays

By Jake Cantrell
on April 25, 2003

Version: 1.0

Type: Function

Category: Calendars/Dates

License: GNU General Public License

Description: This Function will take two dates, and calculate the difference between them in terms of working days, excluding holidays.

I’m sure that someone could take this and clean it up a bit to make it run faster. I just needed something asap.

Based on cronky’s Working Days Function. I added modifications from heymeadows Finding Holidays function, and some other little stuff.

<?

//Based on cronky's Working Days Function. 
//I added modifications from heymeadows Finding Holidays function, and some other little stuff.  
//Jake Cantrell : Senior Programmer MyGov.us
//[email protected]

//This script was designed to calculate the business days that a permit has been open
//since the application process.

//We will be hiring more programmers soon, email me if you think you would be a good //candidate to come work on the MyGov team.
//Our team is located in Ada, OK.
//Our website is http://www.mygov.us (Project Launch Date is August 1, 2003)



function GetTimeStamp($MySqlDate)
  {
  /*
  Take a date in yyyy-mm-dd format and return it to the user in a PHP timestamp
  Robin 06/10/1999
  */
	
  $date_array = explode("-",$MySqlDate); // split the array
	
  $var_year = $date_array[0];
  $var_month = $date_array[1];
  $var_day = $date_array[2];

  $var_timestamp = mktime(0,0,0,$var_month,$var_day,$var_year);
  return($var_timestamp); // return it to the user
  }  // End function GetTimeStamp()




function ordinalDay($ord, $day, $month, $year)
  // ordinalDay returns date of the $ord $day of $month.
  // For example ordinalDay(3, 'Sun', 5, 2001) returns the
  // date of the 3rd Sunday of May (ie. Mother's Day).
  // 
  // Note: $day must be the 3 char abbr. for the day, as
  //       given by date("D"); 
  //
  // By: [email protected]

  {
  $firstOfMonth = GetTimeStamp("$year-$month-01");
  $lastOfMonth  = $firstOfMonth + date("t", $firstOfMonth) * 86400;
  $dayOccurs = 0;
	
  for ($i = $firstOfMonth; $i < $lastOfMonth ; $i += 86400)
     {
     if (date("D", $i) == $day)
        {
		$dayOccurs++;
       if ($dayOccurs == $ord)
         { $ordDay = $i; } 
       }
     }
	 
	 $ordDay = (($ordDay - $firstOfMonth) / 86400) + 1;
if (strlen($ordDay) < 2) { $ordDay = "0$ordDay"; }
return $ordDay;
  }  // End function ordinalDay()

//DO NOT CHANGE ANYTHING IN THIS SECTION
//Not the most beautiful code... but it should be pretty straight foward
//Send comments, questions or suggestions to [email protected]

function subDate($begdate, $enddate)
{
if ($enddate == $begdate){return "0";}
else {

//get begdate
$begyear = substr($begdate, 0, 4);
$begmonth = substr($begdate, 5, 2);
$begday = substr($begdate, 8, 2);



//get enddate (I don't think this is relevant, but it is here :) )
$endyear = substr($enddate, 0, 4);
$endmonth = substr($enddate, 5, 2);
$endday = substr($enddate, 8, 2);

//day of begdate
$getday=mktime(0,0,0,$begmonth,$begday,$begyear);
$daynum=date(d, $getday);

//while loop to add workdays and holidays
while ($past != $enddate)
{
$month="$begmonth";
if (strlen($month) < 2) { $month = "0$month"; }
$year=$begyear;
$daynum=$daynum+01;
if (strlen($daynum) < 2) { $daynum = "0$daynum"; }

$past="$year-$month-$daynum";
$pasttime=mktime(0,0,0,$month,$daynum,$year);
$pastdayofweek=date(l,$pasttime);
if ($pastdayofweek=="Monday"){$workday=$workday+1;}
if ($pastdayofweek=="Tuesday"){$workday=$workday+1;}
if ($pastdayofweek=="Wednesday"){$workday=$workday+1;}
if ($pastdayofweek=="Thursday"){$workday=$workday+1;}
if ($pastdayofweek=="Friday"){$workday=$workday+1;}
//END OF FIRST UNEDITABLE SECTION


//THIS SECTION CONTAINS THE HOLIDAYS AND IS WHAT WILL NEED EDITING ONCE A YEAR IF
//YOUR HOLIDAYS CHANGE
$newyear="$year-01-01";
$memday=ordinalDay(4, 'Mon', 5, $year);
$memorialday="$year-05-$memday";
$independenceday="$year-07-04";
$labday=ordinalDay(1, 'Mon', 9, $year);
$laborday="$year-09-$labday";
$tks1=ordinalDay(3, 'Thu', 11, $year);
$thanksgiving="$year-11-$tks1";
$tks2=$tks1 + 1;
$thanksgiving2="$year-11-$tks2";
$xmas1="$year-12-24";
$xmas2="$year-12-25";
//THIS IS THE END OF THE HOLIDAYS SECTION


//If you add extra holidays you will need to put it in here as well
if ($past==$newyear){$holiday=$holiday+1;}
if ($past==$memorialday){if ($pastdayofweek !== "Sunday"){if ($pastdayofweek !== "Saturday"){$holiday=$holiday+1;}}}
if ($past==$independenceday){$holiday=$holiday+1;}
if ($past==$laborday){if ($pastdayofweek !== "Sunday"){if ($pastdayofweek !== "Saturday"){$holiday=$holiday+1;}}}
if ($past==$thanksgiving){if ($pastdayofweek !== "Sunday"){if ($pastdayofweek !== "Saturday"){$holiday=$holiday+1;}}}
if ($past==$thanksgiving2){if ($pastdayofweek !== "Sunday"){if ($pastdayofweek !== "Saturday"){$holiday=$holiday+1;;}}}
if ($past==$xmas1){if ($pastdayofweek !== "Sunday"){if ($pastdayofweek !== "Saturday"){$holiday=$holiday+1;}}}
if ($past==$xmas2){if ($pastdayofweek !== "Sunday"){if ($pastdayofweek !== "Saturday"){$holiday=$holiday+1;}}}

if ($begmonth == "02")
	{
	if($daynum == "28")
	{
	$begmonth = $begmonth + 01;
	$daynum = "00";
	}
	}

if ($begmonth == "04")
	{
	if($daynum == "30")
	{
	$begmonth = $begmonth + 01;
	$daynum = "00";
	}
	}
if ($begmonth == "06")
	{
	if($daynum == "30")
	{
	$begmonth = $begmonth + 01;
	$daynum = "00";
	}
	}
if ($begmonth == "09")
	{
	if($daynum == "30")
	{
	$begmonth = $begmonth + 01;
	$daynum = "00";
	}
	}
if ($begmonth == "11")
	{
	if($daynum == "30")
	{
	$begmonth = $begmonth + 01;
	$daynum = "00";
	}
	}

if ($daynum == "31")
	{
	$daynum = 00;
	$begmonth = $begmonth + 01;
	if ($begmonth =="13")
	{
	$begmonth = "01";
	$begyear = $begyear + 1;
	}
	}

}
//prints the elapsed workdays
$totalwork = $workday - $holiday;
return $totalwork;
//Thats it... hope this is useful
}
}
?>