strtotime с разными языками? - PullRequest
       3

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

24 голосов
/ 09 августа 2011

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

Есть идеи, как с этим справиться?

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

Ответы [ 9 ]

10 голосов
/ 02 мая 2014

Даты французского месяца:

Январь Фервье Марс Аврил Май Жуан Джульетт сентябрь октябрь ноябрь

Следовательно, для очень конкретного случая, когда месяцы на французском языкеВы можете использовать

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

10 голосов
/ 03 января 2014

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

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

8 голосов
/ 08 февраля 2015

Этот метод должен работать для вас, используя strftime:

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

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

STRFTIME

8 голосов
/ 09 августа 2011

Из документов

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

Редактировать: Шесть лет спустя, и то, что должно было стать дополнительным примечанием о том, почему strtotime () было неуместным решением для рассматриваемой проблемы, стало принятым ответом 100

Чтобы лучше ответить на реальный вопрос, я хочу повторить ответ Марка Б.: несмотря на отрицательные голоса, date_create_from_format в сочетании с пользовательским интерпретатором Month обеспечит наиболее надежное решение

Однако, похоже, что пока еще нет серебряной пули для международного анализа дат, встроенной в PHP.

4 голосов
/ 14 октября 2015

Я написал простую функцию, частично решающую эту проблему. Он не работает как полная 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;
}
2 голосов
/ 05 октября 2016

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

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

Вы можете настроить это для дней недели, а также для любой другой локали.

0 голосов
/ 26 февраля 2018

Добавление расширенной версии Marco Demaio answer . Добавлены сокращения французских дней недели и месяцев:

<?php
public function frenchStrtotime($date_string) {
  $date_string = str_replace('.', '', $date_string); // to remove dots in short names of months, such as in 'janv.', 'févr.', 'avr.', ...
  return strtotime(
    strtr(
      strtolower($date_string), [
        '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',
        'janv'=>'jan',
        'févr'=>'feb',
        'avr'=>'apr',
        'juil'=>'jul',
        'sept'=>'sep',
        'déc'=>'dec',
        'lundi' => 'monday',
        'mardi' => 'tuesday',
        'mercredi' => 'wednesday',
        'jeudi' => 'thursday',
        'vendredi' => 'friday',
        'samedi' => 'saturday',
        'dimanche' => 'sunday',
      ]
    )
  );
}
0 голосов
/ 09 августа 2011

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

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

0 голосов
/ 09 августа 2011

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

setlocale(LC_TIME, "fr_FR");
...