Вывод функции даты на местном языке

Я пытаюсь вывести даты в итальянском формате, используя date() следующим образом:

<?php 
    setlocale(LC_ALL, 'it_IT');
    echo date("D d M Y", $row['eventtime']); 
?>

Тем не менее, он все еще выходит в английском формате. Что еще я мог сделать? Здесь что-то не так?

Решение должно быть специфичным для сценария, а не для всего сервера.


person Shadi Almosri    schedule 11.07.2009    source источник
comment
phpnews.it/articoli/ottenere-date-in-italiano   -  person Sampson    schedule 11.07.2009
comment
Я использовал ваше решение здесь: inmaremma.net Просто символы акцента отображаются как вопросительные знаки. Я считаю, что правильно установил язык html на итальянский с помощью ‹html lang=it-IT›   -  person Adrian Cumpanasu    schedule 11.04.2014
comment
@AdiCumpanasu Вам, вероятно, также потребуется установить кодировку в UTF-8. Поместите следующее между <head> и </head>: <meta charset="utf-8">.   -  person Sampson    schedule 11.04.2014
comment
решил это обертывание следующим образом: utf8_encode(strftime(%A %d %B %Y))   -  person Adrian Cumpanasu    schedule 11.04.2014


Ответы (4)


date() не учитывает язык. Вы должны использовать strftime() и его спецификаторы формата для вывода дат с учетом локали (из date() Руководство по PHP):

Для форматирования дат на других языках следует использовать теги setlocale() и strftime() вместо date().

Что касается комментария Anti Veeranna: он абсолютно прав, так как вы должны быть очень осторожны с настройкой локалей, поскольку они иногда не ограничиваются текущим объемом скрипта. Лучшим способом будет:

$oldLocale = setlocale(LC_TIME, 'it_IT');
echo utf8_encode( strftime("%a %d %b %Y", $row['eventtime']) );
setlocale(LC_TIME, $oldLocale);
person Stefan Gehrig    schedule 11.07.2009
comment
Имейте в виду, что setlocale зависит не от сценария, а от потока, поэтому возможно, что локаль изменится «под вами». ee.php.net/setlocale также объясняет это. - person Anti Veeranna; 12.07.2009
comment
Это даже не просто специфично для потока, это специфично для процесса. Таким образом, вы можете изменить и другие запущенные экземпляры PHP. (php.net/manual/en/< /а>) - person apfelbox; 09.02.2013

Я обнаружил, что setlocale ненадежен, так как он устанавливается для каждого процесса, а не для потока (это упоминается в руководстве). Это означает, что другие запущенные скрипты могут изменить локаль в любое время. Решением является использование IntlDateFormatter из расширения intl php.

$fmt = new \IntlDateFormatter('it_IT', NULL, NULL);
$fmt->setPattern('d MMMM yyyy HH:mm'); 
// See: http://userguide.icu-project.org/formatparse/datetime for pattern syntax
echo $fmt->format(new \DateTime()); 

Если это не работает, вам может потребоваться:

  • Установите расширение intl php (пример Ubuntu): sudo apt-get install php5-intl

  • Установите языковой стандарт, который вы хотите использовать: sudo locale-gen it_IT

person Simon Epskamp    schedule 07.06.2016
comment
Это решение более надежно, чем принятый ответ (с установленным расширением intl php и соответствующей локалью) - person clami219; 23.04.2020

it_IT locale должен быть установлен/включен администратором вашего сервера, иначе это не будет работать.

Итак, решение Джонатана, вероятно, лучшее.

person Anti Veeranna    schedule 11.07.2009
comment
У меня есть полный доступ к серверу, есть идеи, где я могу проверить, какие локальные установлены? - person Shadi Almosri; 12.07.2009
comment
набрав «locale -a», если на этом сервере работает какой-либо вариант Linux/BSD. - person Anti Veeranna; 12.07.2009
comment
Чтобы проверить и установить локаль на сервере: askubuntu.com/a/76106 - person Francesco Galgani; 14.06.2020

О статье на http://www.phpnews.it/articoli/ottenere-date-in-italiano/, блог предлагает альтернативный метод, но код не работает, вот правильный код:

function timestamp_to_date_italian($date)
    {       
        $months = array(
                '01' => 'Gennaio', 
                '02' => 'Febbraio', 
                '03' => 'Marzo', 
                '04' => 'Aprile',
                '05' => 'Maggio', 
                '06' => 'Giugno', 
                '07' => 'Luglio', 
                '08' => 'Agosto',
                '09' => 'Settembre', 
                '10' => 'Ottobre', 
                '11' => 'Novembre',
                '12' => 'Dicembre');

        list($day, $month, $year) = explode('-',date('d-m-Y', $date));      
        return $day . ' ' . $months[$month] . ' ' . $year;

    }
person Sunchaser    schedule 27.04.2017