PHP. Выводим относительное время

Distructor
Администратор
Не всегда требуется выводить время в полном формате (например "07.07.2011 11:26").
Иногда достаточно указать разницу с текущим временем (например "5 минут назад", "2 часа назад"), чтобы не загоняться лишний раз с часовыми поясами. Часто этот способ используется в дополнении к полному формату - например в движке форума phpBB3, если с момента публикации топика/комментария прошло немного времени, то отображается относительное время, иначе - полное.

Но не стоит забывать что в русском языке нужны правильные формы (1 минута, 2 минуты и т.д.).
Немного поразмышляв получаем:
1, 21, 31, .. минута
2-4, 22-24, .. минуты
5-10, 25-30, .. минут
11-20 минут
Пишем функцию которая будет возвращать текстовое описание в правильной форме:

Код: Выделить всё

function pluralize( $count, $type ) 
{ 
    $part_texts = array(
            'd'=>array( 'день', 'дня', 'дней' ),
            'h'=>array( 'час', 'часа', 'часов' ),
            'm'=>array( 'минута', 'минуты', 'минут' )
        );
    
    if ($count==0)
        return '';
    
    if ( $count>=11 && $count<=20 )
        return $count.' '.$part_texts[$type][2];
    
    if ( $count%10==1 )
        return $count.' '.$part_texts[$type][0];
    
    if ( $count%10>=2 && $count%10<=4 )
        return $count.' '.$part_texts[$type][1];
    
    return $count.' '.$part_texts[$type][2].' ';
} 
и функцию которая будет вычислять разницу дат

Код: Выделить всё

function dateAgo( $timestamp )
{
    $diff = time()-$timestamp; 

    $diff_d = floor($diff/86400);  // 86400 - число секунд в сутках
    $diff = $diff - ($diff_d*86400);
    
    $diff_h = floor($diff/3600);  // 3600 - число секунд в дне
    $diff = $diff - ($diff_h*3600);
    
    $diff_m = floor($diff/60);
    $diff = $diff - ($diff_m*60);
    
    $diff_arr = array();
    if ($diff_d>0)
        $diff_arr[] = pluralize($diff_d,'d');
    if ($diff_h>0)
        $diff_arr[] = pluralize($diff_h,'h');
    if ($diff_m>0)
        $diff_arr[] = pluralize($diff_m,'m');
    
    if ( count($diff_arr)==0 )
        return 'только что';
    
    if ( count($diff_arr)>2 )  // если разница возвращается как "2 дня 3 часа 5 минут", то сокращаем ее до "2 дня 3 часа"
        array_pop($diff_arr);

    return implode(' ', $diff_arr).' назад';
} 
Пример использования функции:

Код: Выделить всё

 echo dateAgo( strtotime('2011-04-04') ).'<br>'; // вернет "94 дня 16 часов назад"
 echo dateAgo( strtotime('2011-07-04') ).'<br>'; // вернет  "3 дня 16 часов назад"
 echo dateAgo( strtotime('2011-07-07 15:00') ).'<br>'; // вернет  "1 час 37 минут назад"
 echo dateAgo( time() ).'<br>'; // вернет  "только что" 
При желании можно добавить года, месяца, секунды и т.д.
Думаю у вас это не вызовет особых затруднений. ;)

© Creaternal
Вернуться к началу