Я не могу поверить, что я никогда раньше не сталкивался с этим.
В принципе, я разбираю текст в текстовых документах, созданных человеком, и одно из полей, которые мне нужно проанализировать, – это дата и время. Поскольку я нахожусь в Австралии, даты отформатированы как dd/mm/yyyy
но strtotime
только хочет проанализировать его как дату форматирования в США. Кроме того, взлом /
не будет работать, потому что, как я уже упоминал, эти документы вводятся вручную, а некоторые из них принимают форму d M yy
.
Я пробовал несколько комбинаций setlocale
но независимо от того, что я пытаюсь, язык всегда установлен на английский.
Я довольно уверен, что setlocale – это ключ, но я, похоже, не могу нанести удар по правильному коду. Пробовал эти:
Что-нибудь еще я могу попробовать?
Для ясности: я запускаю IIS с коробкой Windows.
Спасибо 🙂
Iain
Пример:
$mydatetime = strtotime("9/02/10 2.00PM"); echo date('j FYH: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 FYH:i',strtotime($USDateTime));
Поскольку я не могу полагаться на то, что пользователи согласуются с их вводом даты, я сделал свое регулярное выражение немного сложнее:
Надеюсь, это будет соответствовать большинству стилей написания даты …
Быстрое исправление, похоже, заставляет PHP strtotime
использовать формат даты в Великобритании. То есть: заменить все «/» в входящей строке на «-».
Пример:
date('Ym-d', strtotime('01/04/2011'));
Будет производить: 2011-01-04
date('Ym-d', strtotime('01-04-2011'));
Будет производить: 2011-04-01
Для достижения этой цели вы можете использовать str_replace
.
Пример:
str_replace('/', '-', '01/04/2011');
РЕДАКТИРОВАТЬ:
Как указано в комментариях, это работает, потому что PHP интерпретирует косые черты как американские и точки / тире как европейские.
Я широко использовал этот трюк и до сих пор не имел проблем.
Если у кого есть веские причины не использовать это, прокомментируйте.
Проблема в том, что strtotime
не принимает аргумент формата . Как насчет strptime
?
setlocale () сосет именно по той причине, которую вы описываете: вы никогда не знаете, что вы собираетесь получить. Лучше всего обрабатывать строку вручную.
Zend_Date Zend Framework – одна из альтернативных перспективных более точных и последовательных обработок даты. У меня еще нет опыта с этим, только начинаю работать с ним, но до сих пор мне это нравится.
Ах, старая проблема, которую нам посчастливилось получить австралийцы.
То, что я делал в прошлом, это что-то вроде этого
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; }
Хотя это зависит от дат в этом формате dd/mm/yyyy
.
Возможно, вы можете использовать другое регулярное выражение для преобразования из d M yy
или использовать измененный. Я не знаю, было ли это правильно, но это может быть начало:
/^(\d{1,2})(?:\/|\s)(\d{1,2})(?:\/|\s)(\d{2,4})$/
$date = date_create_from_format('d/m/Y', $date_string); $unix_timestamp = $date->getTimestamp();
или
$date = DateTime::createFromFormat('d/m/Y', $date_string); $unix_timestamp = $date->getTimestamp();