Strtotime () не работает с форматом dd / mm / YYYY

Мне очень нравится strtotime() , но руководство пользователя не дает полного описания поддерживаемых форматов дат. strtotime('dd/mm/YYYY') не работает, он работает только с форматом mm/dd/YYYY .

Если у меня есть дата в формате dd/mm/YYYY , как я могу преобразовать ее в YYYY-mm-dd ? Я могу сделать это, используя функцию explode() , но я думаю, что есть лучшие решения.

Вот упрощенное решение:

 $date = '25/05/2010'; $date = str_replace('/', '-', $date); echo date('Ym-d', strtotime($date)); 

Результат:

 2010-05-25 

Документация strtotime гласит:

Даты в форматах m / d / y или dmy устраняются неоднозначно, глядя на разделитель между различными компонентами: если разделитель является косой чертой ( / ), то предполагается, что американский m / d / y ; тогда как если разделитель является тире ( ) или точкой ( . ), тогда предполагается европейский формат dmy .

Вы можете анализировать даты из пользовательского формата (начиная с PHP 5.3) с помощью DateTime :: createFromFormat

 $timestamp = DateTime::createFromFormat('!d/m/Y', '23/05/2010')->getTimestamp(); 

(Помимо этого: The ! Используется для сброса не заданных значений в метку времени Unix, то есть время будет полночь.)


Если вы не хотите (или не можете) использовать PHP 5.3, то полный список доступных форматов даты и времени, которые принимает strtotime, указан на странице руководства по форматам дат. На этой странице более подробно описывается то, что m/d/Y выводится по d/m/Y (но вы можете, как упоминалось в ответах здесь, использовать dmY , dmY или d\tm\tY ).


Раньше я также прибегал к быстрому str_replace упомянутому в другом ответе, а также самоанализу строки даты в другой формат, например

 $subject = '23/05/2010'; $formatted = vsprintf('%3$04d/%2$02d/%1$02d', sscanf($subject,'%02d/%02d/%04d')); $timestamp = strtotime($formatted); 

Из записи STRTOTIME Примечание:

Даты в форматах m / d / y или dmy устраняются неоднозначно, глядя на разделитель между различными компонентами: если разделитель является косой чертой (/), то предполагается, что американский m / d / y; тогда как если разделитель является тире (-) или точкой (.), тогда предполагается европейский формат dmy.

Это так просто.

Это хорошее решение многих проблем:

 function datetotime ($date, $format = 'YYYY-MM-DD') { if ($format == 'YYYY-MM-DD') list($year, $month, $day) = explode('-', $date); if ($format == 'YYYY/MM/DD') list($year, $month, $day) = explode('/', $date); if ($format == 'YYYY.MM.DD') list($year, $month, $day) = explode('.', $date); if ($format == 'DD-MM-YYYY') list($day, $month, $year) = explode('-', $date); if ($format == 'DD/MM/YYYY') list($day, $month, $year) = explode('/', $date); if ($format == 'DD.MM.YYYY') list($day, $month, $year) = explode('.', $date); if ($format == 'MM-DD-YYYY') list($month, $day, $year) = explode('-', $date); if ($format == 'MM/DD/YYYY') list($month, $day, $year) = explode('/', $date); if ($format == 'MM.DD.YYYY') list($month, $day, $year) = explode('.', $date); return mktime(0, 0, 0, $month, $day, $year); } 

Скорее всего,

 false!== ($date !== $date=preg_replace(';[0-2]{2}/[0-2]{2}/[0-2]{2};','$3-$2-$1',$date)) 

это вернет false, если формат не похож на правильный, но он не проверяет, действительна ли дата

Я не нашел лучшего решения. Вы можете использовать explode() , preg_match_all() и т. Д.

У меня есть статическая вспомогательная функция, подобная этой

 class Date { public static function ausStrToTime($str) { $dateTokens = explode('/', $str); return strtotime($dateTokens[1] . '/' . $dateTokens[0] . '/' . $dateTokens[2]); } } 

Вероятно, это лучшее название, но я использую ausStrToTime() потому что он работает с австралийскими датами (с которыми я часто сталкиваюсь, будучи австралиец). Лучшее имя, вероятно, будет стандартизованным именем, но я не уверен, что это такое.

Получаете ли вы это значение из базы данных? Если да, рассмотрите форматирование его в базе данных (например, используйте date_format в mysql). Если нет, взломать значение может быть лучшим выбором, так как strtotime просто не оценивает значения dd / mm / yyyy.

Если вы знаете, что это в формате dd / mm / YYYY, вы можете сделать:

  $regex = '#([/d]{1,2})/([/d]{1,2})/([/d]{2,4})#'; $match = array(); if (preg_match($regex, $date, $match)) { if (strlen($match[3]) == 2) { $match[3] = '20' . $match[3]; } return mktime(0, 0, 0, $match[2], $match[1], $match[3]); } return strtotime($date); 

Он будет соответствовать датам в форме d / m / YY или dd / mm / YYYY (или любой комбинации из двух) …

Если вы хотите поддерживать больше разделителей, чем просто /, вы можете изменить регулярное выражение так:

  $regex = '#([\d]{1,2})[/-]([\d]{1,2})[/-]([\d]{2,4})#'; 

А затем добавьте любые символы, которые вы хотите в бит [/-] (примечание, символ – должен быть последним)

Это обходное решение проще и элегантнее, чем взрывается:

 $my_date = str_replace("/", ".", $my_date); $my_date = strtotime($my_date); $my_date = date("Ymd", $my_date); 

Вам не обязательно знать, в какой формат вы введете дату, но если она идет с косой чертой, они заменяются полными остановками, и она рассматривается как европейская strtotime.

Я попытался преобразовать формат ddmmyy на date("Ymd" формат date("Ymd" , но не работал, когда я прямо передал ddmmyy =date('dmy')

затем понял, что он должен быть в формате yyyy-mm-dd, поэтому. используемая подстрока для организации

 $strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2); 

затем передается на date("Ymd",strtotime($strParam));

это сработало!

$srchDate = date_format(date_create_from_format('d/m/Y', $srchDate), 'Y/m/d');

Это будет работать для вас. Вы преобразовываете String в пользовательский формат даты, где вы можете указать PHP, какой исходный формат String был ему предоставлен. Теперь, когда это формат даты, вы можете преобразовать его в формат даты по умолчанию PHP, который является тем же самым, что используется MySQL.

Самое простое решение:

 $date = '07/28/2010'; $newdate = date('Ym-d', strtotime($date));