Dubrowsky
Хроники одного дупла
Блогово  →  WebDev  → 

Вывод месяца в родительном падеже (PHP, форматирование даты, strftime)

17 Августа 2012 года

Продолжаем разговор о чистоте русского языка в интерфейсах веб-приложений. В предыдущих выпусках мы научились согласовывать существительные с числами, победив, таким образом, проблему "пользователи оставили 2 комментариев". Сегодня будем бороться с форматом даты "Июль 30th" (это из жизни, если что).

Те, кто старательно читал мануал, хорошо помнят, что PHP предоставляет нам две встроенных функции для форматирования дат на основе unix timestamp: общеизвестная date() и чуть менее известная strftime().

Вторая отличается от первой не только своим набором подстановок (неужели кто-то его выучил?) и некоторой корявостью за счет процентиков, но и умением использовать локаль для своей работы:

echo date('D', 1345165549); // "Fri"
echo strftime('%a', 1345165549); // "Птн", если стоит русская локаль

Когда я узнал про эту функцию, я очень порадовался... но ненадолго. Потому что по-русски мы как-то привыкли писать "17 августа", а эта штука максимум что умеет - "17 Август".

Но мы ее всему научим:

function ru_date($format, $date = false) {
	setlocale(LC_ALL, 'ru_RU.cp1251');
	if ($date === false) {
		$date = time();
	}
	if ($format === '') {
		$format = '%e %bg %Y г.';
	}
	$months = explode("|", '|января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря');
	$format = preg_replace("~\%bg~", $months[date('n', $date)], $format);
	$res = strftime($format, $date);
}
echo 	ru_date('%e %bg', 1345165549); // "17 августа"

Теперь вместо "%bg" будет подставляться месяц в родительном падеже и с маленькой буквы. Чтобы оно работало, нужно правильно настроить русскую локаль.

Если передать пустой формат, оно использует "17 августа 2012 г." (все с неразрывными пробелами). Хинт: если чаще приходится форматировать сохраненную дату, а не текущую, можно поменять местами параметры, вызов получится чуть короче.

А кстати, я насчет дефолтного формата не уверен, как лучше - "17 августа 2012 г." (так виндовые часики показывают, например) или "17 августа 2012" (например, в сниппетах Яндекса выводится так). Есть мнение? Или лучше вообще "2012 года", целиком?

Камменты

Данил19.08.2012, 09:49#
Для вывода месяца в родительном падеже я использую костыль, а именно массив месяцев, тупо и просто. А возиться с локализации мне просто лень :)
Andrey29.11.2012, 21:40#
А можно подробней о том как эта регулярка работает?
"~%bg~"
что то не очень вспоминается.
Дуброн самый30.11.2012, 11:07#
Andrey, очень тупо работает, там % экранирован, так что она тупо заменяет подстроку "%bg" на то, что нам нужно. Вместо нее можно было бы использовать str_replace(), но я почему-то не стал =)
То06.09.2015, 00:44#
я в функцию по выводу имени месяца добавил определение окончания для месяцев. 1-Именительный 2-родительный
///////////////
if($month_num=='01' || $month_num=='02' || $month_num=='04' || $month_num=='06' || $month_num=='07' || $month_num=='08' || $month_num=='10' || $month_num=='11' || $month_num=='12'){
if($padezh=='1'){ $oknch='ь'; }
if($padezh=='2'){ $oknch='я'; }
}
if($month_num=='03' || $month_num=='08' ){
if($padezh=='1'){ $oknch=''; }
if($padezh=='2'){ $oknch='а'; }
}
if($month_num=='05' ){
if($padezh=='1'){ $oknch='й'; }
if($padezh=='2'){ $oknch='я'; }
}
//////////////

Написать коммент: памятка постеру

 

Крутые посты wtf??? →

15.02.2013 · 22 каммента · рейтинг 10.19
28.04.2008 · 44 каммента · рейтинг 9.84
23.01.2013 · 19 камментов · рейтинг 9.4
30.01.2013 · 13 камментов · рейтинг 7.79
28.03.2008 · 23 каммента · рейтинг 7.08

Последне камменты

18.04.2017  ДубрОбработка кликов и цели в Яндекс.Метрике, улучшенный вариант: Вячеслав, блин, я там скобку потерял =) Обновил, ...
17.04.2017  Вячеславтам же: вот http://www.totalat.ru/service/remont-akpp-bmw/
17.04.2017  Вячеславтам же: Вашу версию вставил. Даже alert проверочный вывод...
17.04.2017  Вячеславтам же: То что вы там запостили это вместо последнего куск...
17.04.2017  Дубртам же: Привет! 1) код лучше запостить куда-нибудь на ht...

Статсы