Я не могу полагать, что никогда не сталкивался с этим прежде.
В основном я анализирую текст в созданных человеком текстовых документах и одном из полей, которые я должен проанализировать, дата и время. Поскольку я нахожусь в Австралии, даты отформатированы как dd/mm/yyyy
но strtotime
только хочет проанализировать его как американскую отформатированную дату. Кроме того, взрыв /
хождение не должно работать, потому что, поскольку я упомянул, эти документы вводятся рукой, и некоторые из них принимают форму d M yy
.
Я попробовал несколько комбинаций setlocale
но независимо от того, что я пробую, язык всегда устанавливается на американский английский язык.
Я - абсолютно уверенный setlocale, ключ здесь, но я, кажется, не могу ударить на правильный код. Попробованный они:
Что-либо еще я могу попробовать?
Для ясности: я работаю на 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 немного более сложное:
Надо надеяться, это будет соответствовать большинству стилей записи даты...
А, старая проблема, с которой сталкиваются мы, удачливые австралийцы.
Раньше я делал что-то вроде этого
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}) $ /
Проблема в том, что strtotime
не принимает аргумент формат . А как насчет strptime
?
setlocale () отстой именно по той причине, которую вы описываете: никогда не знаешь, что получишь. Лучше всего обрабатывать строку вручную.
Zend Framework Zend_Date является альтернативой, обещающей более точную и последовательную обработку даты. Сам пока не имею опыта, только начинаю с этим работать, но пока мне это нравится.