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 } } ?>