30 May 2013

Php strftime month name

Category howto
Tags #dev #php

Многие задаются вопросом не незнают как правильно сделать склонения дат которую выдают функция strftime(“%B”); Документация по этому вопросу ничего конкретного не говорит, и полное название месяца %B на разных системах выводится по разному

Например в OSX php 5.4.3 %B показывает полное название месяца в нужному падеже например “Августа”, при этом тот же самый код в Debian выдает “Август”, дело в том что в файлах локалях содержатся разные строки строки, в OSX со склонение , а в Debian без склонения, тем не менее это еще не вся магия дело в том что в файлах локали есть такие строки

% Initially alt_digits was supposed to hold alternative symbols for _digits_,
% corresponding to %O modified conversion specification.
% Although in Ukrainian language alternate _names_ are used instead of digits.
% We'll use this keyword to present a list of month names in proper form for
% date, see mon. (%Om)
%
% This hack is dedicated for months it won't work for other %O* modifiers
% (weeks, days etc).
%

Подробнее подкатом.

Но в Debian и в OSX они неработают. А работает в Debian следующая хитрость если написать %b (сокращенное название месяца) то мы увидим что месяц май состоящий из 3-х букв будет склонятся, но все остальные при этом выводятся в 3 буквы.

Поэтому вот простое решение для склонения месяцев которое можно использовать вне зависимости от системы

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

Comments