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='я'; }
}
//////////////
Денис26.03.2020, 08:44#
Вставил этот код в файл .php, но ничего не отображает.
kostikovmu08.09.2020, 10:27#
Что бы работало в конце функции нужно добавить return $res;

<!-- CODE -->
function ru_date($format, $date = false) { setlocale(LC_ALL, 'ru_RU.cp1251'); if ($date === false) { $date = time(); } if ($format === '') { $format = '%e&nbsp;%bg&nbsp;%Y&nbsp;г.'; } $months = explode("|", '|января|февраля|марта|апреля|мая|июня|июля|августа|сентября|октября|ноября|декабря'); $format = preg_replace("~%bg~", $months[date('n', $date)], $format); $res = strftime($format, $date); return $res; } echo ru_date('%e %bg %Y', 1345165549); // "17 августа"
Romualds Cirsis30.03.2021, 12:07#

function ruDate($date, $format = "%e %B %Y") { // date, timestamp or string, default format: 1 Марта 2020
if (!is_numeric($date)) $date = strtotime($date);
if (strpos($format, '%B') !== FALSE) {
switch (date('n', $date)) {
case 1: $rus = 'Января'; break;
case 2: $rus = 'Февраля'; break;
case 3: $rus = 'Марта'; break;
case 4: $rus = 'Апреля'; break;
case 5: $rus = 'Мая'; break;
case 6: $rus = 'Июня'; break;
case 7: $rus = 'Июля'; break;
case 8: $rus = 'Августа'; break;
case 9: $rus = 'Сентября'; break;
case 10: $rus = 'Октября'; break;
case 11: $rus = 'Ноября'; break;
case 12: $rus = 'Декабря'; break;
default: $rus = ''; // just as insurence
}
$format = str_replace('%B', $rus, $format);
}
return strftime($format, $date);
}

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

 

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

02.10.2012 · 94 каммента · рейтинг 13.02
28.04.2008 · 44 каммента · рейтинг 7.52
15.02.2013 · 24 каммента · рейтинг 6.69
19.01.2008 · 20 камментов · рейтинг 5.02
30.01.2013 · 13 камментов · рейтинг 4.91

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

16.05.2023  8DC0WIM www.yandex.ruРеклама паблика вконтакте, как меня модерировали: 8DC0WIM www.yandex.ru
16.05.2023  EWDOLQG7E28H www.yandex.ruНакрутка сердечек и групп вконтакте через V-Like.ru: EWDOLQG7E28H www.yandex.ru

Статсы