Created
December 29, 2013 10:40
-
-
Save ozh/8169202 to your computer and use it in GitHub Desktop.
Human readable time difference between 2 dates in PHP
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
<?php | |
/** | |
* Get human readable time difference between 2 dates | |
* | |
* Return difference between 2 dates in year, month, hour, minute or second | |
* The $precision caps the number of time units used: for instance if | |
* $time1 - $time2 = 3 days, 4 hours, 12 minutes, 5 seconds | |
* - with precision = 1 : 3 days | |
* - with precision = 2 : 3 days, 4 hours | |
* - with precision = 3 : 3 days, 4 hours, 12 minutes | |
* | |
* From: http://www.if-not-true-then-false.com/2010/php-calculate-real-differences-between-two-dates-or-timestamps/ | |
* | |
* @param mixed $time1 a time (string or timestamp) | |
* @param mixed $time2 a time (string or timestamp) | |
* @param integer $precision Optional precision | |
* @return string time difference | |
*/ | |
function get_date_diff( $time1, $time2, $precision = 2 ) { | |
// If not numeric then convert timestamps | |
if( !is_int( $time1 ) ) { | |
$time1 = strtotime( $time1 ); | |
} | |
if( !is_int( $time2 ) ) { | |
$time2 = strtotime( $time2 ); | |
} | |
// If time1 > time2 then swap the 2 values | |
if( $time1 > $time2 ) { | |
list( $time1, $time2 ) = array( $time2, $time1 ); | |
} | |
// Set up intervals and diffs arrays | |
$intervals = array( 'year', 'month', 'day', 'hour', 'minute', 'second' ); | |
$diffs = array(); | |
foreach( $intervals as $interval ) { | |
// Create temp time from time1 and interval | |
$ttime = strtotime( '+1 ' . $interval, $time1 ); | |
// Set initial values | |
$add = 1; | |
$looped = 0; | |
// Loop until temp time is smaller than time2 | |
while ( $time2 >= $ttime ) { | |
// Create new temp time from time1 and interval | |
$add++; | |
$ttime = strtotime( "+" . $add . " " . $interval, $time1 ); | |
$looped++; | |
} | |
$time1 = strtotime( "+" . $looped . " " . $interval, $time1 ); | |
$diffs[ $interval ] = $looped; | |
} | |
$count = 0; | |
$times = array(); | |
foreach( $diffs as $interval => $value ) { | |
// Break if we have needed precission | |
if( $count >= $precision ) { | |
break; | |
} | |
// Add value and interval if value is bigger than 0 | |
if( $value > 0 ) { | |
if( $value != 1 ){ | |
$interval .= "s"; | |
} | |
// Add value and interval to times array | |
$times[] = $value . " " . $interval; | |
$count++; | |
} | |
} | |
// Return string with times | |
return implode( ", ", $times ); | |
} | |
/** | |
Usage: | |
$t = '2013-12-29T00:43:11+00:00'; | |
$t2 = '2013-11-24 19:53:04 +0100'; | |
var_dump( get_date_diff( $t, $t2, 1 ) ); // string '1 month' (length=7) | |
var_dump( get_date_diff( $t, $t2, 2 ) ); // string '1 month, 4 days' (length=15) | |
var_dump( get_date_diff( $t, $t2, 3 ) ); // string '1 month, 4 days, 5 hours' (length=24) | |
*/ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Very helpful, thanks a lot.