I am calculating the date interval between a specified date and the current date using php. I do this so I can print out social friendly timestamps like A few mins ago and 2 hours ago
When I come to the hours part I get something behaving real funny in php. Below is the full working code but when you replace the hours part with this code it always prints out 3 hours.
Defined constant DATE
// The current date timestamp
define('DATE', time());
Buggy code here:
//Only the hours part that' doing something weird
case ($interval >= 3600 && $interval < 86400) :
$return = ( date('H', $interval) < 2)
? (int)date('H', $interval) . ' hour ago'
: (int)date('H', $interval) . ' hours ago';
break;
It breaks when the specified date, lets say in this case, create date is just over an hour ago thus resulting in an interval equal to 3660 seconds. It seems like the date method call date('H', 3660) results in 03. Shouldn’t it result in 01? it is after all just over an hour.
Working code here:
public static function getTimeInterval($date)
{
$interval = DATE - $date;
$return = '';
switch ( $interval )
{
case ($interval <= 60) :
$return = 'a few secs ago';
break;
case ($interval > 60 && $interval < 3600) :
$return = (int)date('i', $interval) . ' mins ago';
break;
case ($interval >= 3600 && $interval < 86400) :
$return = ( abs((date('G', DATE) - date('G', $date))) < 2)
? abs((date('G', DATE) - date('G', $date))) . ' hour ago'
: abs((date('G', DATE) - date('G', $date))) . ' hours ago';
break;
case ($interval >= 86400 && $interval < 604800) :
$return = ( (int)date('j', $interval) === 1)
? (int)date('j', $interval) . ' day ago'
: (int)date('j', $interval) . ' days ago';
break;
case ($interval > 604800 && $interval <= 2592000) :
$return = 'A few weeks ago';
break;
case ($interval > 2592000) :
$return = date('n', $interval) . ' months ago';
break;
case ($interval > 31536000) :
$return = 'Over a year ago';
break;
}
return $return;
}
result of date() depends on your timezone. You can change this behavior by setting timezone manually by date_default_timezone_set()