Created
May 24, 2017 09:17
-
-
Save snowbob/49044d5e564de2d0c7af65be0c7c2968 to your computer and use it in GitHub Desktop.
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
//echo datediff('w', '9 July 2003', '4 March 2004', false); | |
//Which will tell you the number of weekdays between the 9th July 2003 and the 4th of March 2004. | |
<?php | |
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