Strtotime() не работает с форматом dd/mm/YYYY
мне очень нравится , но инструкция не дает полного описания поддерживаемых форматов даты. strtotime('dd/mm/YYYY') не работает, он работает только с .
если у меня есть дата в dd/mm/YYYY формат, как я могу конвертировать его в YYYY-mm-dd?
Я могу сделать это с помощью
14 ответов:
вот упрощенное решение:
$date = '25/05/2010'; $date = str_replace('/', '-', $date); echo date('Y-m-d', strtotime($date));результат:
2010-05-25The
strtotimeдокументация гласит:даты m / d / y или д-мой форматы разбираются путем просмотра разделителя между различными компонентами: если разделитель является косой чертой (/), то американский m / d / y is предполагается; в то время как если разделитель тире ( -) или точкой (.), и д-мой предполагается.
вы можете анализировать даты из пользовательского формата (начиная с 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(но вы можете, как уже упоминалось в ответах здесь, использоватьd-m-Y,d.m.Yилиd\tm\tY).
в прошлом я также прибегал к quicky
str_replaceупоминается в другом ответе, а также самоанализ строки даты в другой формат, например$subject = '23/05/2010'; $formatted = vsprintf('%3d/%2d/%1d', sscanf($subject,'%02d/%02d/%04d')); $timestamp = strtotime($formatted);
с использования функции strtotime рецензия Примечание:
даты в форматах m/d/y или d-m-y разбираются путем просмотра разделителя между различными компонентами: если разделитель является косой чертой (/), то предполагается американский m/d/y; тогда как если разделитель является тире (-) или точкой (.), то предполагается европейский формат d-m-y.
Это так просто.
Это хорошее решение многих проблем:
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};','--',$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()потому что он работает с австралийскими датами (с которыми я часто имею дело, будучи австралийцем). Лучшим именем, вероятно, было бы стандартизированное имя, но я не уверен, что это такое.
Я пытался конвертировать формат ddmmyy в
date("Y-m-d"формат, но не работал, когда я непосредственно передаюddmmyy =date('dmy')затем понял, что это должно быть в формате гггг-ММ-ДД так. используется подстрока для организации
$strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2);затем перешел к
date("Y-m-d",strtotime($strParam));он работал!
вы получаете это значение из базы данных? Если это так, рассмотрите возможность форматирования его в базе данных (используйте
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})#';а затем добавить любые символы, которые вы хотите в
[/-]бит (обратите внимание, символ " - " должен быть последним)
этот обходной путь проще и элегантнее, чем explode:
$my_date = str_replace("/", ".", $my_date); $my_date = strtotime($my_date); $my_date = date("Y-m-d", $my_date);вам не нужно знать, в каком формате вы получаете дату, но если она поставляется с косыми чертами, они заменяются полными остановками, и она рассматривается как Европейская strtotime.
$srchDate = date_format(date_create_from_format('d/m/Y', $srchDate), 'Y/m/d');Это будет работать для вас. Вы конвертируете строку в пользовательский формат даты, где вы можете указать PHP, какой исходный формат строки был ему предоставлен. Теперь, когда это формат даты, вы можете преобразовать его в формат даты PHP по умолчанию, который является тем же самым, который используется MySQL.
Это решение я использую, даже если ноль не существует.
<?php $date = '05/05/2017'; $date = str_replace('/', '-', $date); $date = date('Y-m-d', strtotime($date)); echo $date; ?>
<?php $date_info = 2018-09-27;введите формат в
date()функция, передайте свою дату в .echo date('m-Y-d', strtotime($date_info)); ?>
Comments