-
-
Save yiwang/8c60609672848cb26d03ca48396e43ac to your computer and use it in GitHub Desktop.
Get a date diff between 2 dates
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
example: | |
$count_from = "2010-09-30 00:00:01"; // 24-Hour Format: YYYY-MM-DD HH:MM:SS" | |
$count_to = date("Y-m-d H:i:s");//today (2012-08-23 00:00:01) | |
echo datediff("d",$count_from,$count_to); | |
return: 693 (days) | |
*/ | |
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)) < $dateto) { | |
$months_difference++; | |
} | |
$months_difference--; | |
$datediff = $months_difference; | |
break; | |
case 'y': // Difference between day numbers | |
$datediff = date("z", $dateto) - date("z", $datefrom); | |
break; | |
case "d": // Number of full days | |
$datediff = floor($difference / 86400); | |
break; | |
case "w": // Number of full weekdays | |
$days_difference = floor($difference / 86400); | |
$weeks_difference = floor($days_difference / 7); // Complete weeks | |
$first_day = date("w", $datefrom); | |
$days_remainder = floor($days_difference % 7); | |
$odd_days = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder? | |
if ($odd_days > 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; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment