Мне нравится функция относительное время xdebug . Проблема в том, что мне нужно было иметь некоторую детализацию.
Другими словами, я останавливаюсь на секундах или минутах, если я решу.
Итак,
echo fTime(strtotime('-23 hours 5 minutes 55 seconds'),0);
покажет,
23 часа, 5 минут назад
Вместо
23 часа, 5 минут, 55 секунд назад
Я также хотел, чтобы он НЕ опускался ниже в массиве, если он достиг одного из более высоких значений времени.
Так что, если он показывает годы, я хочу показать только годы и месяцы.
Итак,
echo fTime(strtotime('-1 year 2 months 3 weeks 4 days 16 hours 15 minutes 22 seconds'),0);
покажет
1 год, 2 месяца назад
вместо
1 год, 2 месяца, 3 недели, 4 дня, 16 часов, 15 минут, 22 секунды назад
Следующее изменение кода сделало то, что мне было нужно. Реквизиты сначала идут в xdebug.
Надеюсь, кому-то еще это пригодится:
function fTime($time, $gran=-1) {
$d[0] = array(1,"second");
$d[1] = array(60,"minute");
$d[2] = array(3600,"hour");
$d[3] = array(86400,"day");
$d[4] = array(604800,"week");
$d[5] = array(2592000,"month");
$d[6] = array(31104000,"year");
$w = array();
$return = "";
$now = time();
$diff = ($now-$time);
$secondsLeft = $diff;
$stopat = 0;
for($i=6;$i>$gran;$i--)
{
$w[$i] = intval($secondsLeft/$d[$i][0]);
$secondsLeft -= ($w[$i]*$d[$i][0]);
if($w[$i]!=0)
{
$return.= abs($w[$i]) . " " . $d[$i][1] . (($w[$i]>1)?'s':'') ." ";
switch ($i) {
case 6: // shows years and months
if ($stopat==0) { $stopat=5; }
break;
case 5: // shows months and weeks
if ($stopat==0) { $stopat=4; }
break;
case 4: // shows weeks and days
if ($stopat==0) { $stopat=3; }
break;
case 3: // shows days and hours
if ($stopat==0) { $stopat=2; }
break;
case 2: // shows hours and minutes
if ($stopat==0) { $stopat=1; }
break;
case 1: // shows minutes and seconds if granularity is not set higher
break;
}
if ($i===$stopat) { break 0; }
}
}
$return .= ($diff>0)?"ago":"left";
return $return;
}
Марк