Strtotime() не работает с форматом dd/mm/YYYY
Мне очень нравится функция strtotime()
, но руководство пользователя не дает полного описания поддерживаемых форматов дат. strtotime('dd/mm/YYYY')
не работает, он работает только с форматом mm/dd/YYYY
.
Если у меня есть дата в формате dd/mm/YYYY
, как я могу преобразовать ее в YYYY-mm-dd
?
Я могу сделать это, используя функцию explode()
, но я думаю, что есть лучшие решения.
Ответы
Ответ 1
Вот упрощенное решение:
$date = '25/05/2010';
$date = str_replace('/', '-', $date);
echo date('Y-m-d', strtotime($date));
Результат:
2010-05-25
Документация strtotime
гласит:
Даты в форматах m/d/y или dmy устраняются, глядя на разделитель между различными компонентами: если разделитель является косой чертой (/), то предполагается американский m/d/y; тогда как если разделитель является тире ( -) или точкой (.), тогда предполагается европейский формат d-m-y.
Ответ 2
Вы можете анализировать даты из пользовательского формата (начиная с PHP 5.3) с помощью DateTime:: createFromFormat
$timestamp = DateTime::createFromFormat('!d/m/Y', '23/05/2010')->getTimestamp();
(Помимо этого: !
используется для reset не заданных значений для отметки времени Unix, т.е. время будет полночь.)
Если вы не хотите (или не можете) использовать PHP 5.3, то полный список доступных форматов даты и времени, который принимает strtotime, указан на Date Форматы. Эта страница более подробно описывает тот факт, что m/d/Y
выводится на d/m/Y
(но вы можете, как упоминалось в ответах здесь, использовать d-m-Y
, d.m.Y
или 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);
Ответ 3
Из записи STRTOTIME
Примечание:
Даты в форматах m/d/y или d-m-y устраняются неоднозначно, рассматривая разделитель между различными компонентами: если разделитель является косой чертой (/), тогда предполагается американский m/d/y; тогда как если разделитель является тире (-) или точкой (.), то предполагается европейский формат d-m-y.
Это так просто.
Ответ 4
Это хорошее решение многих проблем:
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);
}
Ответ 5
Самый быстрый должен быть
false!== ($date !== $date=preg_replace(';[0-2]{2}/[0-2]{2}/[0-2]{2};','$3-$2-$1',$date))
это вернет false, если формат не похож на правильный, но он не проверяет, действительна ли дата.
Ответ 6
Я не нашел лучшего решения. Вы можете использовать explode()
, preg_match_all()
и т.д.
У меня есть статическая вспомогательная функция, подобная этой
class Date {
public static function ausStrToTime($str) {
$dateTokens = explode('/', $str);
return strtotime($dateTokens[1] . '/' . $dateTokens[0] . '/' . $dateTokens[2]);
}
}
Вероятно, это лучшее название, но я использую ausStrToTime()
, потому что он работает с австралийскими датами (с которыми я часто занимаюсь, будучи австралиец). Лучшее имя, вероятно, будет стандартизованным именем, но я не уверен, что это такое.
Ответ 7
Получаете ли вы это значение из базы данных? Если да, рассмотрите форматирование его в базе данных (например, используйте date_format
в mysql). Если нет, взломать значение может быть лучшим выбором, так как strtotime просто не оценивает значения dd/mm/yyyy.
Ответ 8
Если вы знаете это в формате 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})#';
Затем добавьте любые символы в бит [/-]
(Примечание, символ должен быть последним)
Ответ 9
Это обходное решение проще и элегантнее, чем взорваться:
$my_date = str_replace("/", ".", $my_date);
$my_date = strtotime($my_date);
$my_date = date("Y-m-d", $my_date);
Вам не обязательно знать, в какой формат вы введете дату, но если она идет с косой чертой, они заменяются полными остановками, и она рассматривается как европейская strtotime.
Ответ 10
Я попытался преобразовать формат ddmmyy в формат date("Y-m-d"
, но не работал, когда я прямо передал ddmmyy =date('dmy')
тогда понял, что он должен быть в формате yyyy-mm-dd, поэтому. используемая подстрока для организации
$strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2);
затем передается в date("Y-m-d",strtotime($strParam));
это сработало!
Ответ 11
$srchDate = date_format(date_create_from_format('d/m/Y', $srchDate), 'Y/m/d');
Это будет работать для вас.
Вы преобразовываете String в пользовательский формат даты, где вы можете указать PHP, какой исходный формат String был ему предоставлен.
Теперь, когда это формат даты, вы можете преобразовать его в формат даты по умолчанию PHP, который является тем же самым, что используется MySQL.
Ответ 12
Простейшим решением является следующее:
$date = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));