Мне очень нравится 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));