Работает ли strtotime только в языке по умолчанию на сервере? Следующий код должен быть разрешен до 11 августа 2005 года, однако он использует французский «аут» вместо английского «ауг».
Любые идеи, как справиться с этим?
<?php $date = strtotime('11 aout 05'); echo date('d M Y',$date); ?>
Из документов
Разбор любого текстового описания даты и времени в текстовой таблице Unix
Как упоминалось, strtotime
не учитывает локаль. Однако вы можете использовать strptime
(см. strptime
), поскольку согласно документам:
Month and weekday names and other language dependent strings respect the current locale set with setlocale() (LC_TIME).
Обратите внимание, что в зависимости от вашей системы, языка и кодировки вам придется учитывать акцентированные символы.
Французские месяцы:
janvier février mars avril mai juin juillet août septembre octobre novembre décembre
Следовательно, для конкретного случая, когда месяцы на французском языке, вы можете использовать
function myStrtotime($date_string) { return strtotime(strtr(strtolower($date_string), array('janvier'=>'jan','février'=>'feb','mars'=>'march','avril'=>'apr','mai'=>'may','juin'=>'jun','juillet'=>'jul','août'=>'aug','septembre'=>'sep','octobre'=>'oct','novembre'=>'nov','décembre'=>'dec'))); }
Функция в любом случае не сломается, если вы передадите $ date_string на английском языке , потому что она не будет делать никакой замены.
Этот метод должен работать для вас, используя strftime
:
setlocale (LC_TIME, "fr_FR.utf8"); //Setting the locale to French with UTF-8 echo strftime(" %d %h %Y",strtotime($date));
STRFTIME
Я написал простую функцию, частично решая эту проблему. Он не работает как полный strtotme () , но определяет количество имен месяцев в датах.
<?php // For example, I get the name of the month from a // date "1 January 2015" and set him (with different languages): echo month_to_number('January').PHP_EOL; // returns "01" (January) echo month_to_number('Января', 'ru_RU').PHP_EOL; // returns "01" (January) echo month_to_number('Мая', 'ru_RU').PHP_EOL; // returns "05" (May) echo month_to_number('Gennaio', 'it_IT').PHP_EOL; // returns "01" (January) echo month_to_number('janvier', 'fr_FR').PHP_EOL; // returns "01" (January) echo month_to_number('Août', 'fr_FR').PHP_EOL; // returns "08" (August) echo month_to_number('Décembre', 'fr_FR').PHP_EOL; // returns "12" (December)
Аналогичным образом, мы можем перейти к определению чисел и дней недели и т. Д.
Функция:
<?php function month_to_number($month, $locale_set = 'ru_RU') { $month = mb_convert_case($month, MB_CASE_LOWER, 'UTF-8'); $month = preg_replace('/я$/', 'й', $month); // fix for 'ru_RU' $locale = setlocale(LC_TIME, '0'); setlocale(LC_TIME, $locale_set.'.UTF-8'); $month_number = FALSE; for ($i = 1; $i <= 12; $i++) { $time_month = mktime(0, 0, 0, $i, 1, 1970); $short_month = date('M', $time_month); $short_month_lc = strftime('%b', $time_month); if (stripos($month, $short_month) === 0 OR stripos($month, $short_month_lc) === 0) { $month_number = sprintf("%02d", $i); break; } } setlocale(LC_TIME, $locale); // return locale back return $month_number; }
Ключом к решению этого вопроса является преобразование иностранных текстовых представлений в их английские коллеги. Я также нуждался в этом, так вдохновленный ответами, которые уже были даны, я написал хорошую и чистую функцию, которая будет работать для извлечения английского месяца.
function getEnglishMonthName($foreignMonthName,$setlocale='nl_NL'){ setlocale(LC_ALL, 'en_US'); $month_numbers = range(1,12); foreach($month_numbers as $month) $english_months[] = strftime('%B',mktime(0,0,0,$month,1,2011)); setlocale(LC_ALL, $setlocale); foreach($month_numbers as $month) $foreign_months[] = strftime('%B',mktime(0,0,0,$month,1,2011)); return str_replace($foreign_months, $english_months, $foreignMonthName); } echo getEnglishMonthName('juli'); // Outputs July
Вы можете настроить это и на дни недели.
Это зависит от региона. Если бы он должен был проверять каждый язык для каждого синтаксиса, то на FOREVER нужно было бы разбираться даже с простейшей строкой даты.
Если у вас есть строка с известным форматом, рассмотрите возможность использования date_create_from_format () , которая будет намного эффективнее и меньше ошибок
Попробуйте установить язык перед конверсией:
setlocale(LC_TIME, "fr_FR");