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