Дата и время по-русски
9 ноября 2011 г.
По сути — стандартная функция
date()
с вкраплениями в формат вывода на русском языке.
function ru_date($format,$ts=false)
{
if(!function_exists('num_word')) { function num_word($n,$a,$b,$c,$m=1){$n=sprintf("%.0f",$n);$x=abs($n>9?mb_substr($n,-2):$n);return($m?($m==2?number_format($n,0,' ',' '):$n).' ':'').(($x%=100)>9&&$x<20||($x%=10)>4||$x==0?$c:($x==1?$a:$b));} }
$now = time();
if(!$ts) $ts = $now;
$res = '';
$months = array('М'=>array('','Январь','Февраль','Март','Апрель','Май','Июнь','Июль','Август','Сентябрь','Октябрь','Ноябрь','Декабрь'),'м'=>array('','января','февраля','марта','апреля','мая','июня','июля','августа','сентября','октября','ноября','декабря'));
$weekdays = array('Н'=>array('Воскресенье','Понедельник','Вторник','Среда','Четверг','Пятница','Суббота'),'н'=>array('воскресенье','понедельник','вторник','среда','четверг','пятница','суббота'));
$days = array('Д'=>array(-2=>'Позавчера',-1=>'Вчера',0=>'Сегодня',1=>'Завтра',2=>'Послезавтра'),'д'=>array(-2=>'позавчера',-1=>'вчера',0=>'сегодня',1=>'завтра',2=>'послезавтра'));
for($i=0;$i<=mb_strlen($format);$i++)
{
$code = mb_substr($format,$i,1);
if($code=='М' || $code=='м') $res .= $months[$code][date('n',$ts)];
elseif($code=='Н' || $code=='н') $res .= $weekdays[$code][date('w',$ts)];
elseif($code=='Д' || $code=='д') { $delta = round((strtotime(date('Y-m-d',$ts))-strtotime(date('Y-m-d')))/86400); $res .= $delta>-3 && $delta<3 ? $days[$code][$delta] : date('j',$ts).' '.$months['м'][date('n',$ts)].(date('Y',$ts)==date('Y')?'':' '.date('Y',$ts).' г.'); }
elseif($code=='В' || $code=='в')
{
$delta = abs($ts-$now);
if($delta<30) $res .= $ts-$now>=0 ? ($code == 'В' ? 'Прямо сейчас' : 'прямо сейчас') : ($code == 'В' ? 'Только что' : 'только что');
elseif($delta>1650 && $delta<2050) $res .= $ts-$now>0 ? ($code == 'В' ? 'Через полчаса' : 'через полчаса') : ($code == 'В' ? 'Полчаса назад' : 'полчаса назад');
elseif($delta<3300) $res .= $ts-$now>0 ? ($code == 'В' ? 'Через ' : 'через ').num_word(round($delta/60),'минуту','минуты','минут') : num_word(round($delta/60),'минуту','минуты','минут').' назад';
elseif($delta<86400 && ($delta%3600<=300 || abs(3600-($delta%3600))<=300)) $res .= $ts-$now>0 ? ($code == 'В' ? 'Через ' : 'через ').num_word(round($delta/3600),'час','часа','часов') : num_word(round($delta/3600),'час','часа','часов').' назад';
else return ru_date(str_replace('в','д',str_replace('В','Д',$format)),$ts).' в '.date('G:i',$ts);
}
else $res .= date(mb_substr($format,$i,1),$ts);
}
return $res;
}
Везде, где эта функция объявлена, можно
date(...)
смело заменять на
ru_date(...)
с теми же параметрами (кроме
предопределенных констант в формате вывода) — ничего не изменится, но ноявится возможность добавления в формат русских букв:
М |
Название месяца с большой буквы (от Январь до Декабрь) |
м |
Название месяца с маленькой буквы для использования вместе с числом (от января до декабря) |
Н |
День недели с большой буквы (от Понедельник до Воскресенье) |
н |
День недели с маленькой буквы (от понедельник до воскресенье) |
Д |
Полная дата. Примеры вариантов: 31 июля 2005 г., 19 сентября (если год совпадает с текущим, он не пишется), Позавчера, Вчера, Сегодня, Завтра, Послезавтра. |
д |
То же самое, что и Д, но слова позавчера, вчера, сегодня, завтра и послезавтра пишутся с маленькой буквы. |
В |
Дата и время (или только время, если дата совпадает с текущей). Результат зависит от того, насколько и в каком направлении (прошлое или будущее) переданное по втором параметре время отличается от текущего. Варианты такие:
• разница от 0 до 30 секунд: Только что или Прямо сейчас;
• от 30 секунд до 27 минут 30 секунд: N минут назад или Через N минут;
• от 27 минут 30 секунд до 32 минут 30 секунд: Полчаса назад или Через полчаса;
• от 32 минут 30 секунд до 55 минут: N минут назад или Через N минут;
• кратна 3600 секундам (часу) с погрешностью в 300 секунд (5 минут): N часов назад или Через N часов;
• иначе: 31 июля 2005 г. в 12:00, 19 сентября в 16:11, Сегодня в 3:14.
Для определения словоформ используется функция num_word() (включена в код).
|
в |
То же самое, что и В, но первая буква результата будет маленькой. |