Данила Лучинский6.0
Один за всех, все за одного
+7 921 308-88-38 ICQ 344-00-443 Сообщение  
dan@luchinsky.ru danluchinsky Заказать сайт
Кодоводство

Дата и время по-русски

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() (включена в код).
в То же самое, что и В, но первая буква результата будет маленькой.
Метки:  PHP