2012-01-05 3 views
45

У меня есть объект DateTime, который я в настоящее время форматированием черезобъект форматирования DateTime, уважая Locale :: getDefault()

$mytime->format("D d.m.Y") 

Который дает мне точно формат мне нужно:

Tue 5.3 .2012

Единственный недостающий пункт - правильный язык. Мне нужен немецкий перевод Tue (Tuesday), который является Die (Dienstag).

Это дает мне право установки

Locale::getDefault() 

локаль Но я не знаю, как сказать DateTime::format, чтобы использовать его.

Не существует ли способ сделать что-то вроде:

$mytime->format("D d.m.Y", \Locale::getDefault()); 
+0

позаботьтесь: strftime ("% a% e.% L.% Y", \ Locale :: getDefault()) не работает (по крайней мере, здесь, на моей установке), поскольку getDefault() возвращает "de" вместо «de_DE» ... – stoefln

+1

Второй параметр strftime должен быть меткой времени, а не локалью. – Jonathan

+0

О, извините. Совершенно ясно, что это не работает. То, что я действительно хотел сказать, это то, что setlocale (LC_TIME, \ Locale :: getDefault()) не работает (в моем приложении symfony2) – stoefln

ответ

48

Это потому, что format не обращает внимания на местности. Вместо этого вы должны использовать strftime.

Например:

setlocale(LC_TIME, "de_DE"); //only necessary if the locale isn't already set 
$formatted_time = strftime("%a %e.%l.%Y", $mytime->getTimestamp()) 
+8

Это поведение отмечено в php-документах в [DateTime :: format] (http: // www.php.net/manual/en/datetime.format.php): * Этот метод не использует локали. Вся информация выводится на английском языке. '* – rdlowrey

+20

strftime() не работает с датами до 1970 года, Date_time :: format() не работает с локалями ... есть ли что-нибудь, что работает с обоими? –

+1

@Jay K: Всегда можно расширить родной язык DateTime класса PHP, чтобы добавить к нему локализацию. – Duroth

81

Вы можете использовать расширение Intl для форматирования даты. Он будет форматировать даты/время в соответствии с выбранной локалью, или вы можете переопределить это с помощью IntlDateFormatter::setPattern().

Может показаться быстрый пример использования настраиваемого шаблона для желаемого формата вывода.

$dt = new DateTime; 

$formatter = new IntlDateFormatter('de_DE', IntlDateFormatter::SHORT, IntlDateFormatter::SHORT); 
$formatter->setPattern('E d.M.yyyy'); 

echo $formatter->format($dt); 

Что выводит следующее (на сегодня, по крайней мере).

Д.А. 4.6.2013


Edit: Ааа бух! Ответил древний вопрос, потому что некоторые комментарии натолкнули его на список! По крайней мере, опция Intl упоминается сейчас.

+0

хорошо, что вы ответили на древний вопрос, потому что этот вопрос появляется вверху результатов поиска Google и используется только для предоставления устаревшей информации. –

+0

Плюс вы получаете значок «Некромант», когда вы (успешно) отвечаете на старый вопрос. – aesede

+0

И он должен быть обновлен как правильный ответ. – Celoain

Смежные вопросы