Following this post by Akash Mehta, I thought that a precise dateDiff() function might be helpful for many of you. The following function calculates the difference of two dates in “day” or “month” or “year” more precisely. This function is production ready and you can use it in any of your application which mainly works with these date difference. I have found it somewhere in web, just forgot the source. Thanks to the unknown author of this excellent function.
function datediff($interval, $datefrom, $dateto, $using_timestamps = false)
{
/*
$interval can be:
yyyy - Number of full years
q - Number of full quarters
m - Number of full months
y - Difference between day numbers
(eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33".
The datediff is "-32".)
d - Number of full days
w - Number of full weekdays
ww - Number of full weeks
h - Number of full hours
n - Number of full minutes
s - Number of full seconds (default)
*/
if (!$using_timestamps) {
$datefrom = strtotime($datefrom, 0);
$dateto = strtotime($dateto, 0);
}
$difference = $dateto - $datefrom; // Difference in seconds
switch($interval) {
case 'yyyy': // Number of full years
$years_difference = floor($difference / 31536000);
if (mktime(date("H", $datefrom),
date("i", $datefrom),
date("s", $datefrom),
date("n", $datefrom),
date("j", $datefrom),
date("Y", $datefrom)+$years_difference) > $dateto) {
$years_difference--;
}
if (mktime(date("H", $dateto),
date("i", $dateto),
date("s", $dateto),
date("n", $dateto),
date("j", $dateto),
date("Y", $dateto)-($years_difference+1)) > $datefrom) {
$years_difference++;
}
$datediff = $years_difference;
break;
case "q": // Number of full quarters
$quarters_difference = floor($difference / 8035200);
while (mktime(date("H", $datefrom),
date("i", $datefrom),
date("s", $datefrom),
date("n", $datefrom)+($quarters_difference*3),
date("j", $dateto),
date("Y", $datefrom)) < $dateto) {
$months_difference++;
}
$quarters_difference--;
$datediff = $quarters_difference;
break;
case "m": // Number of full months
$months_difference = floor($difference / 2678400);
while (mktime(date("H", $datefrom),
date("i", $datefrom),
date("s", $datefrom),
date("n", $datefrom)+($months_difference),
date("j", $dateto), date("Y", $datefrom)) 7)
{ // Sunday
$days_remainder--;
}
if ($odd_days > 6) { // Saturday
$days_remainder--;
}
$datediff = ($weeks_difference * 5) + $days_remainder;
break;
case "ww": // Number of full weeks
$datediff = floor($difference / 604800);
break;
case "h": // Number of full hours
$datediff = floor($difference / 3600);
break;
case "n": // Number of full minutes
$datediff = floor($difference / 60);
break;
default: // Number of full seconds (default)
$datediff = $difference;
break;
}
return $datediff;
}





13 Responses to “Calculating date difference more precisely in PHP”
March 14, 2008
djmmtsThis is gorgeous. Thanks.
April 4, 2008
Garryis this function complete, what about the other intervals in the switch statement?
May 7, 2008
Rajeev SharmaAkash I’m so pleased to read that you acknowledge and thanked the author of this function and made it available for others to be benefited.
There exist thankless creatures who claim others work. :-)
This function was written by and available at:
http://www.ilovejackdaniels.com/php/php-datediff-function/
May 11, 2008
Akash Mehta@Rajeev: Thanks for the heads up. Actually, Hasin Hyder wrote this post, he was merely following on from a similar post I made on “relative time” (see http://www.developertutorials.com/blog/php/give-your-visitors-relative-y-php-69/). He will probably link the original post now that you have pointed it out, but I’ll leave it up to him; the comments on that post are quite useful as well.
June 23, 2008
ChaBiDid not work.
July 7, 2008
abhinavhow to calculate the diffence between two dates stored in database mysql in the format yyyy-mm-dd (eg. 2008-09-12). date is stored in database in date datatype……
wating for a sooner reply
January 23, 2009
PolyDid not work on this line:
date(“j”, $dateto), date(“Y”, $datefrom)) 7)
is this
date(“j”, $dateto), date(“Y”, $datefrom))==7)
or
date(“j”, $dateto), date(“Y”, $datefrom)) < 7)
thanks
February 8, 2009
TomI’m getting the same problem as Poly. Any info on this?
February 25, 2009
Chandfunction get_time_difference( $start, $end )
{
$uts['start'] =$start;
$uts['end'] =$end;
if( $uts['start']!=-1 && $uts['end']!=-1 )
{
if( $uts['end'] >= $uts['start'] )
{
$diff = $uts['end'] – $uts['start'];
if( $days=intval((floor($diff/86400))) )
$diff = $diff % 86400;
if( $hours=intval((floor($diff/3600))) )
$diff = $diff % 3600;
if( $minutes=intval((floor($diff/60))) )
$diff = $diff % 60;
$diff = intval( $diff );
return( array(‘days’=>$days, ‘hours’=>$hours, ‘minutes’=>$minutes, ‘seconds’=>$diff) );
}
else
{
return -2;
//trigger_error( “Ending date/time is earlier than the start date/time”, E_USER_WARNING );
}
}
else
{
return -3;
//trigger_error( “Invalid date/time data detected”, E_USER_WARNING );
}
return( false );
}
January 9, 2010
VentzyIndeed there is something missing on “date(ājā, $dateto), date(āYā, $datefrom)) 7)”.
Does not work.
January 18, 2010
jefferygreat …
this would work for me…
it saved me a lot of time….
thanks for sharing such a good code…
May 16, 2010
John HThis script is incomplete. The switch case for months references undefined variables required for the calculation.
October 11, 2010
AnonymousHow do we use this? Example function call?