Как заставить strtotime проанализировать даты в австралийце (т.е. Великобритания) формат: dd/mm/yyyy?

Я не могу полагать, что никогда не сталкивался с этим прежде.

В основном я анализирую текст в созданных человеком текстовых документах и одном из полей, которые я должен проанализировать, дата и время. Поскольку я нахожусь в Австралии, даты отформатированы как dd/mm/yyyy но strtotime только хочет проанализировать его как американскую отформатированную дату. Кроме того, взрыв / хождение не должно работать, потому что, поскольку я упомянул, эти документы вводятся рукой, и некоторые из них принимают форму d M yy.

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

Я - абсолютно уверенный setlocale, ключ здесь, но я, кажется, не могу ударить на правильный код. Попробованный они:

  • au
  • au-en
  • en_AU
  • Австралия
  • aus

Что-либо еще я могу попробовать?

Для ясности: я работаю на IIS с полем Windows.

Большое спасибо :)

Iain

Пример:

$mydatetime = strtotime("9/02/10 2.00PM");
echo date('j F Y H:i', $mydatetime);

Производит

2 September 2010 14:00

Я хочу, чтобы это произвело:

9 February 2010 14:00

Мое решение

Я даю галочку одному из ответов здесь, поскольку это - намного более легкое к чтению решение взорвать, но здесь - то, что я придумал:

$DateTime = "9/02/10 2.00PM";
$USDateTime = preg_replace('%([0-3]?[0-9]{1})\s*?[\./ ]\s*?((?:1[0-2])|0?[0-9])\s*?[./ ]\s*?(\d{4}|\d{2})%', '${2}/${1}/${3}', $DateTime);  
echo date('j F Y H:i',strtotime($USDateTime));

Поскольку я не могу полагаться на пользователей, чтобы согласовываться с их записью даты, я сделал свое regex немного более сложное:

  • 0 или 1 цифра между 0 и 3
  • 1 цифра между 0 и 9 - да, которому это будет соответствовать 37 как допустимая дата, но я думаю regex, является уже достаточно большой!
  • Мог быть некоторый пробел
  • Символ-разделитель (a'.', '/' или '')
  • Мог быть некоторый пробел
  • Также:
    • Число между 10 и 12 ИЛИ
    • Число между 1 и 9 с дополнительным продвижением 0
  • Мог быть некоторый пробел
  • Символ-разделитель (a'.', '/' или '')
  • Мог быть некоторый пробел
  • Также:
    • Номер 2 цифры долго ИЛИ
    • Номер 4 цифры долго

Надо надеяться, это будет соответствовать большинству стилей записи даты...

11
задан Iain Fraser 15 March 2010 в 03:50
поделиться

3 ответа

А, старая проблема, с которой сталкиваются мы, удачливые австралийцы.

Раньше я делал что-то вроде этого

public static function getTime($str) { // 3/12/2008

       preg_match_all('/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/', $str, $matches);

       return (isset($matches[0][0])) ? strtotime($matches[3][0] . '-' . $matches[2][0] . '-' . $matches[1][0]) : NULL;

    }

Хотя здесь используются даты в таком формате дд / мм / гггг .

Вы, вероятно, можете использовать другое регулярное выражение или около того для преобразования из d M yy или использовать измененное. Не знаю, правильно ли это, но это может быть начало:

/ ^ (\ d {1,2}) (?: \ / | \ S) (\ d {1,2}) ( ?: \ / | \ s) (\ d {2,4}) $ /

1
ответ дан 3 December 2019 в 04:31
поделиться

Проблема в том, что strtotime не принимает аргумент формат . А как насчет strptime ?

3
ответ дан 3 December 2019 в 04:31
поделиться

setlocale () отстой именно по той причине, которую вы описываете: никогда не знаешь, что получишь. Лучше всего обрабатывать строку вручную.

Zend Framework Zend_Date является альтернативой, обещающей более точную и последовательную обработку даты. Сам пока не имею опыта, только начинаю с этим работать, но пока мне это нравится.

1
ответ дан 3 December 2019 в 04:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: