Иногда достаточно указать разницу с текущим временем (например "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