Strtotime () не працює у форматі dd / mm / YYYY


167

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

Якщо у мене є дата у dd/mm/YYYYформаті, як я можу це перетворити YYYY-mm-dd? Я можу це зробити за допомогою explode()функції, але я думаю, що є кращі рішення.


7
Вам насправді не потрібно перетворювати його у формат "РРРР-мм-дд", щоб його розібрати - вам просто потрібно змінити його на "ДД-мм-РРРР", що можна зробити зstr_replace('/', '-', $date);
Гевін Коутс

Відповіді:


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 () правильно проаналізував дату у форматі "dd / mm / yy", вам потрібно замінити "/" на "-". Тому вам потрібні лише перші два рядки відповіді: $date = '25/05/2010'; $date = str_replace('/', '-', $date); Додатковий рядок не потрібен для вирішення вашої проблеми.
Гевін Коутс

Це правильно, лише якщо день> 12: $ date = '1/2/34'; // 1 лютого 2034 р. Дата ехо ('d M Y', strtotime ($ дата)); // 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'));
vusan

3

швидше, мабуть, має бути

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

це повернеться помилковим, якщо формат не виглядає належним, але він перевіряє, чи дата не є дійсною


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

тоді зрозумів, що він повинен бути у форматі "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));

це спрацювало!


2

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

Це буде працювати для вас. Ви конвертуєте String у спеціальний формат дати, де ви можете вказати PHP, що таке оригінальний формат String, який йому був наданий. Тепер, коли це формат дати, ви можете перетворити його у формат дати за замовчуванням PHP, який той самий, який використовується MySQL.


найчистіше і найтонше рішення
Марко Марсала

1

Ви отримуєте це значення з бази даних? Якщо так, то розгляньте можливість її форматування в базі даних (наприклад, date_formatу mysql). Якщо ні, то найкраща ставка може підірвати значення, оскільки strtotime просто не оцінює значення dd / mm / yyyy.


1

Якщо ви знаєте, що це в dd / мм / РРРР, ви можете зробити:

    $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 / gYYY (або будь-яка їх комбінація) ...

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

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

А потім додайте будь-які символи, які ви хочете, в [/-]біт (Примітка. Символ повинен бути останнім)


Безумовно, ваш регулярний вираз повинен використовуватись \dдля десяткових цифр, а не [/d]для прямокутної косої риски або символу d .
салат

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
Це неправильно. Питання прямо стосується входів dd / mm / yyyy.
Метт Флетчер

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.