Intereting Posts
Использовать PHP для перезаписи URL-адресов? Как я могу создать алгоритм для генерации случайных строк? Отправка данных, таких как целые числа и текстовые строки, из телефона в веб-базу данных MySQL SUM () дает неверную итоговую сумму Почему эта str_ireplace () работает с строкой, отличной от ASCII? как установить короткий тег (<?) в php? Laravel Недопустимый оператор и комбинация значений Exception on with () с отношением ownTo () Laravel 5.2 Пробный тест загрузки загруженного файла PHP fopen (): Имя файла не может быть пустой причиной getRealPath return false realurl генерирует записи без cHash Загляните вперед, когда итерация массива в PHP Может ли закодированная строка base64 содержать пробелы? Как форматировать данные вложенной модели Model в массив? Предупреждение: Отсутствует граница в данных POST с несколькими данными / формами данных в Unknown в строке 0 Максимальная длина сгенерированного хэша при использовании пароля_шиба?

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

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

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

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

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

  • а.е.
  • аи-ен
  • en_AU
  • Австралия
  • AUS

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

Для ясности: я запускаю 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)); 

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

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

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

Быстрое исправление, похоже, заставляет 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();