Strtotime () не работает с форматом дд / мм / гггг - PullRequest
155 голосов
/ 23 мая 2010

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

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

Ответы [ 14 ]

363 голосов
/ 23 мая 2010

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

$date = '25/05/2010';
$date = str_replace('/', '-', $date);
echo date('Y-m-d', strtotime($date));

Результат:

2010-05-25

Документация strtotime гласит:

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

58 голосов
/ 23 мая 2010

Вы можете анализировать даты в произвольном формате (начиная с 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);
16 голосов
/ 10 октября 2012

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

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

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

13 голосов
/ 17 января 2011

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

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

}
3 голосов
/ 22 декабря 2011

самое быстрое, вероятно, должно быть

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

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

2 голосов
/ 31 августа 2015

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

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

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

class Date {

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

    }

}

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

1 голос
/ 21 октября 2016

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

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

1 голос
/ 12 апреля 2015

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

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

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

1 голос
/ 23 мая 2010

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

    $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})#';

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...