Calculate number of days between two dates except holidays
Here I am going to show you some php functions to calculate number of days between two dates. You can add these function in you function library and use any where as your requirement.
Mainly these functions uses when you are working on salary or employee attendance module to get number of working days of employee to calculate his/her salary.
First two functions to calculate number of days between two dates.
Method-1
<?php function getDays($dateStart, $dateEnd) { $dateStartTS = strtotime($dateStart); $dateEndTS = strtotime($dateEnd); $dateDiff = $dateEndTS - $dateStartTS; return floor($dateDiff/(60*60*24)); } echo $totalDays = getDays('2015-08-01', '2015-08-30'); // => will return 29 ?> |
In php there is predefine function ($date1->diff($date2);) available to calculate number of days between two dates.
Method-2
<?php function getDays($dateStart, $dateEnd) { $dateStartTS = new DateTime($dateStart); $dateEndTS = new DateTime($dateEnd); $interval = $dateStartTS->diff($dateEndTS); return $interval->format('%R%a days'); } echo $totalDays = getDays('2015-08-01', '2015-08-30'); // => will return 29 ?> |
If you want to skip holidays while calculating working days use below function, i found this function on php official website and it works fine.
<?php function getWorkingDays($startDate,$endDate,$holidays){ $endDate = strtotime($endDate); $startDate = strtotime($startDate); $days = ($endDate - $startDate) / 86400 + 1; $no_full_weeks = floor($days / 7); $no_remaining_days = fmod($days, 7); $the_first_day_of_week = date("N", $startDate); $the_last_day_of_week = date("N", $endDate); //---->The two can be equal in leap years when february has 29 days, the equal sign is added here if ($the_first_day_of_week <= $the_last_day_of_week) { if ($the_first_day_of_week <= 6 && 6 <= $the_last_day_of_week) $no_remaining_days--; if ($the_first_day_of_week <= 7 && 7 <= $the_last_day_of_week) $no_remaining_days--; } else { if ($the_first_day_of_week == 7) { $no_remaining_days--; if ($the_last_day_of_week == 6) { $no_remaining_days--; } } else { $no_remaining_days -= 2; } } //---->february in none leap years gave a remainder of 0 but still calculated weekends between first and last day, this is one way to fix it $workingDays = $no_full_weeks * 5; if ($no_remaining_days > 0 ) { $workingDays += $no_remaining_days; } foreach($holidays as $holiday){ $time_stamp=strtotime($holiday); if ($startDate <= $time_stamp && $time_stamp <= $endDate && date("N",$time_stamp) != 6 && date("N",$time_stamp) != 7) $workingDays--; } return $workingDays; } $holidays=array("2008-12-25","2008-12-26","2009-01-01"); echo getWorkingDays("2008-12-22","2009-01-02",$holidays) // => will return 7 ?> |