Pull to refresh

Красивые и правильные даты на любом языке

Reading time2 min
Views12K
Прочитал топик Патч к Drupal-модулю Date — показываем месяцы в родительном падеже, и решил тоже сделать решение, направленное на искоренение косноязычности при выводе дат. Друпал используют не все, кто использует PHP, а вот мое решение может заюзать любой пользователь PHP 5.2+.



Я написал класс, использующий возможности встроенного в PHP класса DateTime, который разрешает добавлять собственные функции для форматирования, при этом собственные форматтеры имеют приоритет над встроенными. Так, например, поставленную задачу с месяцами можно решить, задав свой форматтер для ключа «F», вот примерно так:

$idt = new IDateTime();

$months = array(1 => 'Января', 2 => 'Февраля', 3 => 'Марта', 	4 => 'Апреля', 
	5 => 'Мая', 6 => 'Июня', 7 => 'Июля', 8 => 'Августа', 
	9 => 'Сентября', 10 => 'Октября', 11 => 'Ноября', 12 => 'Декабря');

// override "F" format key to use russian month names
$idt->addFormatter('F', function($d) use ($months) {
	return $months[$d->format('n')];
});

echo $idt->format('j F Y');// 1 Марта 2010

Форматтер — это имя функции, массив (класс, метод), массив (объект, метод) или Closure (если у вас php-5.3+). В форматтер передается 1 аргумент — это объект DateTime.

Таким же образом можно задать вывод дней недели, а можно, допустим, сделать свой ключ, которого нет в форматах date(). Например, вместо "{season}" подставлять «весна», «лето», «осень», «зима».

Реализация: я сделал обертку вокруг встроенного DateTime. Поначалу я просто унаследовал свой класс от DateTime и реализация была еще проще, чем сейчас. К сожалению, с какого-то перепуга стали возникать сегфолты и концепцию пришлось сменить.

UPD: с подачи inkover немного оптимизировал процесс форматирования.

Скачать исходник класса можно здесь: http://vbolshov.org.ru/samples/idatetime/IDateTime.phps
Tags:
Hubs:
Total votes 12: ↑9 and ↓3+6
Comments14

Articles