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;
}
If you found this post useful you may also want to check these out:
- Calculating Difference Between Two Dates Using PHP
- Basic JavaScript Date and Time Functions
- JavaScript – Formatted Date, Back, Forward Buttons
- Displaying Current Date with JavaScript and Basic Math Calculations
- Linux vs. Windows web Hosting, does it make a difference?
- What is the difference between Unix and NT systems?
