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)
{
	 // Get time stamp
     $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
//The function returns the no. of business days between two dates and it skips the holidays
function getWorkingDays($startDate,$endDate,$holidays){
    // do strtotime calculations just once
    $endDate = strtotime($endDate);
    $startDate = strtotime($startDate);
 
 
    //The total number of days between the two dates. We compute the no. of seconds and divide it to 60*60*24
    //We add one to inlude both dates in the interval.
    $days = ($endDate - $startDate) / 86400 + 1;
 
    $no_full_weeks = floor($days / 7);
    $no_remaining_days = fmod($days, 7);
 
    //It will return 1 if it's Monday,.. ,7 for Sunday
    $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
    //In the first case the whole interval is within a week, in the second case the interval falls in two weeks.
    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 {
        // (edit by Tokes to fix an edge case where the start day was a Sunday
        // and the end day was NOT a Saturday)
 
        // the day of the week for start is later than the day of the week for end
        if ($the_first_day_of_week == 7) {
            // if the start date is a Sunday, then we definitely subtract 1 day
            $no_remaining_days--;
 
            if ($the_last_day_of_week == 6) {
                // if the end date is a Saturday, then we subtract another day
                $no_remaining_days--;
            }
        }
        else {
            // the start date was a Saturday (or earlier), and the end date was (Mon..Fri)
            // so we skip an entire weekend and subtract 2 days
            $no_remaining_days -= 2;
        }
    }
 
    //The no. of business days is: (number of weeks between the two dates) * (5 working days) + the remainder
//---->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;
    }
 
    //We subtract the holidays
    foreach($holidays as $holiday){
        $time_stamp=strtotime($holiday);
        //If the holiday doesn't fall in weekend
        if ($startDate <= $time_stamp && $time_stamp <= $endDate && date("N",$time_stamp) != 6 && date("N",$time_stamp) != 7)
            $workingDays--;
    }
 
    return $workingDays;
}
 
//Example:
 
$holidays=array("2008-12-25","2008-12-26","2009-01-01");
 
echo getWorkingDays("2008-12-22","2009-01-02",$holidays)
// => will return 7
?>
Posted in: PHP

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.