working not mostrar lc_all funciona fecha español es_es date_format actual php datetime localization locale intl

not - strftime php



¿Nombres de mes localizados(cortos) usando IntlDateFormatter en PHP? (2)

En mi máquina de desarrollo de Windows, configuré la configuración regional en ita :

setlocale(LC_TIME, ''ita''); echo strftime(''%b''); // dic

Mientras (supongo que no puedo probar ahora mismo) en un sistema * nix, debería usarlo:

setlocale(LC_TIME, ''it'');

Si trato de configurarlo en mi Windows, no funciona, imprimiendo Dec

Parece que no puedo confiar en setlocale() , así que debería usar IntlDateFormatter como lo sugiere @hakre. Sin embargo, puedo encontrar la constante que me da el nombre del mes y el corto:

IntlDateFormatter::NONE (integer) Do not include this element IntlDateFormatter::FULL (integer) Completely specified style (Tuesday, April 12, 1952 AD or 3:30:42pm PST) IntlDateFormatter::LONG (integer) Long style (January 12, 1952 or 3:30:32pm) IntlDateFormatter::MEDIUM (integer) Medium style (Jan 12, 1952) IntlDateFormatter::SHORT (integer) Most abbreviated style, only essential data (12/13/52 or 3:30pm)


Muy feo, pero funciona:

$formatter = /IntlDateFormatter::create( ''it'', /IntlDateFormatter::LONG, /IntlDateFormatter::NONE, /DateTimeZone::UTC, // Doesn''t matter /IntlDateFormatter::GREGORIAN, ''MMM'' ); $months = array_map( function($m) use($formatter){ return $formatter->format(mktime(0, 0, 0, $m, 2, 1970)); }, range(1, 12) ); var_dump($months);

Lo extraño es it nombres de los meses están en minúsculas, y tienen el caso correcto. ¡Dejaré la pregunta sin respuesta buscando una mejor solución!


De la referencia , algunos códigos de formato de mes:

Symbol Meaning Example: M month in year M or MM 09 MMM Sept MMMM September MMMMM S

La función de PHP para establecer el formato es: IntlDateFormatter::setPattern , algunos ejemplos:

class LocaleDateFormat { private $locale; private $pattern; public function __construct($pattern, $locale = ''en_US'') { $this->setLocale($locale); $this->setPattern($pattern); } public function setLocale($locale) { $this->locale = $locale; } public function setPattern($pattern) { $this->pattern = $pattern; } public function localeFormat($locale, $date) { $this->setLocale($locale); return $this->format($date); } public function format($date) { $formatter = new IntlDateFormatter($this->locale, IntlDateFormatter::FULL, IntlDateFormatter::FULL); $formatter->setPattern($this->pattern); return $formatter->format($date); } } $dateFormat = new LocaleDateFormat(''MMMM''); # Long Month Names $date = new DateTime(); # Now $locales = ["en_US", "de_DE", "sv_SE", "ru_RU"]; foreach ($locales as $i => $locale) { $month = $dateFormat->localeFormat($locale, $date); printf("%d. %s - %s/n", $i+1, $locale, $month); }

Salida:

1. en_US - December 2. de_DE - Dezember 3. sv_SE - december 4. ru_RU - декабря

Para obtener una lista de configuraciones regionales, consulte aquí:

  • Lista de collaters disponibles en PHP?

El ejemplo real para los nombres cortos de mes en diferentes configuraciones regionales:

$locales = ["en_US", "de_DE", "sv_SE", "ru_RU", ''it'', ''it_IT'', ''it_CH'']; $dateFormat = new LocaleDateFormat(''MMM''); # Short Month Names $date = new DateTime(); # Now foreach (range(1, 12) as $monthNumber) { $date->setDate(2012, $monthNumber, 1); printf("%02d: ", $monthNumber); foreach ($locales as $locale) { $monthLabel = $dateFormat->localeFormat($locale, $date); $pad = str_repeat('' '', max(0, 8 - mb_strlen($monthLabel, ''UTF-8''))); printf("%s: %s%s ", $locale, $monthLabel, $pad); } echo "/n"; }

Ejemplar de salida:

01: en_US: Jan de_DE: Jan sv_SE: jan ru_RU: янв. it: gen it_IT: gen it_CH: gen 02: en_US: Feb de_DE: Feb sv_SE: feb ru_RU: февр. it: feb it_IT: feb it_CH: feb 03: en_US: Mar de_DE: Mär sv_SE: mar ru_RU: марта it: mar it_IT: mar it_CH: mar 04: en_US: Apr de_DE: Apr sv_SE: apr ru_RU: апр. it: apr it_IT: apr it_CH: apr 05: en_US: May de_DE: Mai sv_SE: maj ru_RU: мая it: mag it_IT: mag it_CH: mag 06: en_US: Jun de_DE: Jun sv_SE: jun ru_RU: июня it: giu it_IT: giu it_CH: giu 07: en_US: Jul de_DE: Jul sv_SE: jul ru_RU: июля it: lug it_IT: lug it_CH: lug 08: en_US: Aug de_DE: Aug sv_SE: aug ru_RU: авг. it: ago it_IT: ago it_CH: ago 09: en_US: Sep de_DE: Sep sv_SE: sep ru_RU: сент. it: set it_IT: set it_CH: set 10: en_US: Oct de_DE: Okt sv_SE: okt ru_RU: окт. it: ott it_IT: ott it_CH: ott 11: en_US: Nov de_DE: Nov sv_SE: nov ru_RU: нояб. it: nov it_IT: nov it_CH: nov 12: en_US: Dec de_DE: Dez sv_SE: dec ru_RU: дек. it: dic it_IT: dic it_CH: dic