Подтвердить что ты не робот

Strtotime с разными языками?

Работает ли strtotime только в языке по умолчанию на сервере? Нижеприведенный код должен быть разрешен к августу 11, 2005, однако он использует французский "аут" вместо английского "ауг".

Любые идеи, как справиться с этим?

<?php
    $date = strtotime('11 aout 05');
    echo date('d M Y',$date);
?>
4b9b3361

Ответ 1

Из docs

Разберитесь о любом текстовом описании даты и времени на английском языке в Unix временная метка

Ответ 2

Как уже упоминалось, 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).

Обратите внимание, что в зависимости от вашей системы, языка и кодировки вам придется учитывать символы с акцентом.

Ответ 3

Французские месяцы:

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 на английском языке, потому что она не будет делать никакой замены.

Ответ 4

Этот метод должен работать для вас с помощью strftime:

setlocale (LC_TIME, "fr_FR.utf8"); //Setting the locale to French with UTF-8

echo strftime(" %d %h %Y",strtotime($date));

strftime

Ответ 5

Я написал простую функцию, частично решая эту проблему. Он не работает как полный 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;
}

Ответ 6

Ключом к решению этого вопроса является преобразование иностранных текстовых представлений в их английские коллеги. Я также нуждался в этом, так вдохновленный ответами, которые уже были даны, я написал хорошую и чистую функцию, которая будет работать для получения имени месяца в месяц.

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

Вы можете настроить это и в течение дней недели.

Ответ 7

Это зависит от языка. Если бы он должен был проверять каждый язык для каждого синтаксического анализа, он бы приблизился к FOREVER, чтобы разобрать даже простейшую строку даты.

Если у вас есть строка с известным форматом, рассмотрите возможность использования date_create_from_format(), что будет намного более эффективным и менее ошибочным, печать

Ответ 8

Попробуйте установить язык перед преобразованием:

setlocale(LC_TIME, "fr_FR");