Strtotime () не работает с форматом дд / мм / гггг


167

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

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


7
Вы на самом деле не нужно , чтобы преобразовать его в формат «YYYY-мм-дд» , чтобы разобрать его - нужно просто изменить его на «дд-мм-гггг», что может быть сделано сstr_replace('/', '-', $date);
Gavin Коутс

Ответы:


399

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

$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 ; тогда как, если разделителем является тире ( - ) или точка ( . ), то подразумевается европейский формат dmy .


2
@Web Logic Я не могу понять формат по умолчанию функции strtotime (), если я пишу strtotimr ('01 -01-2010 '), он понимается как формат dd-mm-YYYY или mm-dd-YYYY?
Симон

3
Если вы проверите это с: echo date('Y-m-l', strtotime('01-01-2010'));Результат 2010-01-Friday. Так что день, наступающий в конце, зависит от того, как вы указали формат даты для dateфункции.

1
Хотя то, что вы разместили здесь, является правильным и отвечает на вопрос пользователей - это обходной путь решения актуальной проблемы. Чтобы strtotime () правильно анализировал дату в формате «дд / мм / гг», необходимо заменить «/» на «-». Поэтому вам действительно нужны только первые две строки ответа: $date = '25/05/2010'; $date = str_replace('/', '-', $date); дополнительная строка не нужна для решения вашей проблемы.
Гэвин Коутс

Это верно только в том случае, если день> 12: $ date = '1/2/34'; // 1 февраля 2034 г. эхо-дата ('d M Y', strtotime ($ date)); // 02 января 2034
kurdtpage

Спасибо друг. Действительно сделал мой день.
BEingprabhU

64

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

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

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


Если вы не хотите (или не можете) использовать PHP 5.3, то полный список доступных форматов даты / времени, которые принимает strtotime, приведен на странице справочника по форматам даты . Эта страница более подробно описывает тот факт , что 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);

17

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

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);

}

16

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

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

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


Мы можем реализовать это, поскольку они не будут выдавать ошибку, но когда я проверил $tи $t1показал другой результат. Я проверил, как это. $t=strtotime(date('d-m-Y'));и $t1=strtotime(date('m/d/Y'));
Вусан

3

скорей всего должно быть

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

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


2

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

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

class Date {

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

    }

}

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


2

Я пытался преобразовать формат 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));

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


2

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

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


самое чистое и лучшее решение
Марко Марсала

1

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


1

Если вы знаете, что это в дд / мм / ГГГГ, вы можете сделать:

    $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);

Это будет соответствовать датам в форме д / м / ГГ или дд / мм / ГГГГ (или любой комбинации двух) ...

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

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

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


Конечно, ваше регулярное выражение должно использоваться \dдля десятичных цифр, а не [/d]для прямой косой черты или символа d .
2010 года

1

Этот обходной путь проще и элегантнее, чем взрыв:

$my_date = str_replace("/", ".", $my_date);
$my_date = strtotime($my_date);
$my_date = date("Y-m-d", $my_date);

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


0

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

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

3
Это не верно. Вопрос явно связан с вводом дд / мм / гггг.
Мэтт Флетчер

0

Это решение я использую, даже если ведущий ноль есть.

<?php
 $date = '05/05/2017';
 $date = str_replace('/', '-', $date);
 $date = date('Y-m-d', strtotime($date));

 echo $date;
?>


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.