Ответ 1
Из docs
Разберитесь о любом текстовом описании даты и времени на английском языке в Unix временная метка
Работает ли strtotime только в языке по умолчанию на сервере? Нижеприведенный код должен быть разрешен к августу 11, 2005, однако он использует французский "аут" вместо английского "ауг".
Любые идеи, как справиться с этим?
<?php
$date = strtotime('11 aout 05');
echo date('d M Y',$date);
?>
Из docs
Разберитесь о любом текстовом описании даты и времени на английском языке в Unix временная метка
Как уже упоминалось, strtotime
не учитывает языковой стандарт. Однако вы можете использовать strptime
(см. http://ca1.php.net/manual/en/function.strptime.php), поскольку согласно документам:
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));
Я написал простую функцию, частично решая эту проблему. Он не работает как полный 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");