Strtotime () nie działa z formatem dd / mm / RRRR

167

Bardzo podoba mi się ta strtotime()funkcja, ale instrukcja obsługi nie zawiera pełnego opisu obsługiwanych formatów dat. strtotime('dd/mm/YYYY')nie działa, działa tylko z mm/dd/YYYYformatem.

Jeśli mam datę w dd/mm/YYYYformacie, jak mogę ją przekonwertować na YYYY-mm-dd? Mogę to zrobić używając explode()funkcji, ale myślę, że są lepsze rozwiązania.

Szymon
źródło
7
W rzeczywistości nie musisz konwertować go do formatu „RRRR-mm-dd”, aby go przeanalizować - wystarczy zmienić go na „dd-mm-RRRR”, co można zrobić za pomocąstr_replace('/', '-', $date);
Gavin Coates,

Odpowiedzi:

399

Oto uproszczone rozwiązanie:

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

Wynik:

2010-05-25

strtotimeDokumentacja brzmi:

Daty w formatach m / d / r lub dmy są ujednoznaczniane, patrząc na separator między różnymi składnikami: jeśli separatorem jest ukośnik ( / ), zakłada się amerykański m / d / r ; natomiast jeśli separatorem jest myślnik ( - ) lub kropka ( . ), to zakłada się europejski format dmy .

Wymuskany
źródło
2
@Web Logic Nie rozumiem domyślnego formatu funkcji strtotime (), jeśli piszę strtotimr ('01 -01-2010 '), rozumiem to jako format dd-mm-RRRR lub mm-dd-RRRR?
Simon
3
Jeśli przetestujesz to za pomocą: echo date('Y-m-l', strtotime('01-01-2010'));Wynik to 2010-01-Friday. Zatem dzień, który nadejdzie na koniec, zależy od tego, jak określisz format daty w datefunkcji.
1
Chociaż to, co tu zamieściłeś, jest poprawne i odpowiada na pytania użytkowników - jest to okrężny sposób rozwiązania rzeczywistego problemu. Aby strtotime () poprawnie przeanalizował datę w formacie „dd / mm / rr”, należy zamienić „/” na „-”. Dlatego tak naprawdę potrzebujesz tylko pierwszych dwóch wierszy odpowiedzi: $date = '25/05/2010'; $date = str_replace('/', '-', $date); Dodatkowa linia nie jest konieczna do rozwiązania problemu.
Gavin Coates,
Jest to poprawne tylko wtedy, gdy dzień jest> 12: $ date = '1/2/34'; // 1 lutego 2034 echo date ('d M Y', strtotime ($ date)); // 02 stycznia 2034
kurdtpage
Dzięki stary. Naprawdę zrobiłem mój dzień.
BEingprabhU
64

Możesz analizować daty z niestandardowego formatu (od PHP 5.3) za pomocą DateTime :: createFromFormat

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

(Na marginesie: !służy do resetowania nieokreślonych wartości do uniksowego znacznika czasu, tj. Czas będzie wynosił północ).


Jeśli nie chcesz (lub nie możesz) używać PHP 5.3, pełna lista dostępnych formatów daty / czasu, które akceptuje strtotime, znajduje się na stronie podręcznika Formaty dat . Że strona bardziej dokładnie opisuje fakt, że m/d/Ywnioskuje się d/m/Y(ale można, jak wspomniano tutaj w odpowiedziach, stosowanie d-m-Y, d.m.Ylub d\tm\tY).


W przeszłości uciekałem się również do szybkiego sposobu, o którym str_replacemowa w innej odpowiedzi, a także do samodzielnego analizowania ciągu daty do innego formatu, takiego jak

$subject   = '23/05/2010';
$formatted = vsprintf('%3$04d/%2$02d/%1$02d', sscanf($subject,'%02d/%02d/%04d'));
$timestamp = strtotime($formatted);
salathe
źródło
17

To dobre rozwiązanie wielu problemów:

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

}
Jonathan Roy
źródło
16

Z zapisu STRTOTIME Uwaga:

Daty w formatach m / d / r lub dmy są rozróżniane, patrząc na separator między różnymi składnikami: jeśli separatorem jest ukośnik (/), zakłada się amerykański m / d / r; natomiast jeśli separatorem jest myślnik (-) lub kropka (.), to zakłada się europejski format dmy.

To takie proste.

L. Smit
źródło
Możemy to zaimplementować, ponieważ nie będą dawać błędów, ale kiedy sprawdziłem $ti $t1pokazują inny wynik. Sprawdziłem tak. $t=strtotime(date('d-m-Y'));i $t1=strtotime(date('m/d/Y'));
vusan
3

prawdopodobnie powinno być najszybsze

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

zwróci to fałsz, jeśli format nie wygląda na właściwy, ale nie sprawdzi, czy data jest prawidłowa

skullnobrains
źródło
2

Nie znalazłem lepszego rozwiązania. Można użyć explode(), preg_match_all()itp

Mam taką statyczną funkcję pomocniczą

class Date {

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

    }

}

Prawdopodobnie jest na to lepsza nazwa, ale używam, ausStrToTime()ponieważ pasuje do australijskich dat (z którymi często mam do czynienia, będąc Australijczykiem). Lepszą nazwą byłaby prawdopodobnie nazwa standardowa, ale nie jestem pewien, co to jest.

Alex
źródło
2

Próbowałem przekonwertować format ddmmyy na date("Y-m-d"format, ale nie działało, gdy przechodzę bezpośrednioddmmyy =date('dmy')

potem zdałem sobie sprawę, że musi to być format rrrr-mm-dd, więc. użyty podciąg do uporządkowania

$strParam = '20'.substr($_GET['date'], 4, 2).'-'.substr($_GET['date'], 2, 2).'-'.substr($_GET['date'], 0, 2);  

następnie przeszedł do date("Y-m-d",strtotime($strParam));

zadziałało!

smakintel.com
źródło
2

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

To zadziała dla Ciebie. Konwertujesz String na niestandardowy format daty, w którym możesz określić w PHP, jaki jest oryginalny format String, który został mu nadany. Teraz, gdy jest to format daty, możesz przekonwertować go na domyślny format daty PHP, który jest taki sam, jaki jest używany przez MySQL.

Fi Horan
źródło
najczystsze i najlepsze rozwiązanie
Marco Marsala
1

Czy otrzymujesz tę wartość z bazy danych? Jeśli tak, rozważ sformatowanie go w bazie danych ( date_formatna przykład użyj w mysql). Jeśli nie, eksplozja wartości może być najlepszym rozwiązaniem, ponieważ strtotime po prostu nie wydaje się doceniać wartości dd / mm / rrrr.

Joseph Mastey
źródło
1

Jeśli wiesz, że jest to dd / mm / RRRR, możesz zrobić:

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

Dopasuje daty w formacie d / m / RR lub dd / mm / RRRR (lub dowolna kombinacja tych dwóch) ...

Jeśli chcesz obsługiwać więcej separatorów niż tylko /, możesz zmienić wyrażenie regularne na:

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

A następnie dodaj dowolne znaki do [/-]bitu (uwaga, znak - musi być ostatni)

ircmaxell
źródło
Z pewnością Twój regex powinien używać \ddla cyfr po przecinku, a nie [/d]do przodu-slash lub D charakteru .
salathe
1

To obejście jest prostsze i bardziej eleganckie niż Rozbij:

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

Nie musisz wiedzieć, w jakim formacie otrzymujesz datę, ale jeśli zawiera ukośniki, są one zastępowane kropkami i jest traktowane jako europejskie przez strtotime.

user2623027
źródło
0

Najprostsze rozwiązanie jest takie:

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));
Simply_jhen
źródło
3
To jest źle. Pytanie jest wyraźnie związane z danymi wejściowymi dd / mm / rrrr.
Matt Fletcher,
0

To rozwiązanie, którego używam, nawet jeśli istnieje zero wiodące.

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

 echo $date;
?>
Nandhini
źródło
0

$ date_info = '20 / 02/2019 '; echo date ('Ym-d', strtotime (str_replace ('/', '-', $ date_info)));

nazmulhaqued
źródło
0

To takie proste

date('Y-m-d H:i:s', strtotime( str_replace('/', '-', $from_date ) ) );
Prajwol KC
źródło