/** * Return elapsed time between two datetimes in human readable format. * * @param datetime $start Initial datetime. * @param datetime $end Final datetime (default is current time). * * @return string The formatted elapsed time. */ public static function timeBetween($start, $end = null) { // Convert datetimes to timestamps $start = MiscUtils::datetime2timestamp($start); $end = is_null($end) ? time() : MiscUtils::datetime2timestamp($end); $SECOND = 1; $MINUTE = 60 * $SECOND; $HOUR = 60 * $MINUTE; $DAY = 24 * $HOUR; $WEEK = 7 * $DAY; $MONTH = 30 * $DAY; $YEAR = 365 * $DAY; $increments = array(array($SECOND, 'second'), array($MINUTE, 'minute'), array($HOUR, 'hour'), array($DAY, 'day'), array($WEEK, 'week'), array($MONTH, 'month'), array($YEAR, 'year')); $diff = $end - $start; $plural = ''; $units = ceil($diff / $increments[count($increments) - 1][0]); $unit = $increments[count($increments) - 1][1]; for ($i = 1; $i < count($increments); $i++) { if ($increments[$i - 1][0] <= $diff && $diff < $increments[$i][0]) { $units = ceil($diff / $increments[$i - 1][0]); $unit = $increments[$i - 1][1]; break; } } if ($units > 1) { $plural = 's'; } return sprintf("%d %s%s ago", $units, $unit, $plural); }