Strtotime () funktioniert nicht mit dem Format TT / MM / JJJJ

167

Die strtotime()Funktion gefällt mir sehr gut , aber das Benutzerhandbuch enthält keine vollständige Beschreibung der unterstützten Datumsformate. strtotime('dd/mm/YYYY')funktioniert nicht, es funktioniert nur mit mm/dd/YYYYFormat.

dd/mm/YYYYWie kann ich ein Datum im Format konvertieren YYYY-mm-dd? Ich kann es mit der explode()Funktion tun , aber ich denke, es gibt bessere Lösungen.

Simon
quelle
7
Sie müssen es nicht in das Format "JJJJ-MM-TT" konvertieren, um es zu analysieren - Sie müssen es nur in "TT-MM-JJJJ" ändern, was mitstr_replace('/', '-', $date);
Gavin Coates

Antworten:

399

Hier ist die vereinfachte Lösung:

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

Ergebnis:

2010-05-25

Die strtotimeDokumentation lautet:

Daten in m / d / y oder dmy Format werden durch Betrachten des Trennzeichens zwischen den verschiedenen Komponenten : Wenn das Trennzeichen ein Schrägstrich ( / ) ist, wird das amerikanische m / d / y angenommen; Wenn das Trennzeichen ein Bindestrich ( - ) oder ein Punkt ( . ) ist, wird das europäische dmy- Format angenommen.

TRiG
quelle
2
@Web Logic Ich kann das Standardformat der Funktion strtotime () nicht verstehen. Wenn ich strtotimr ('01 -01-2010 ') schreibe, wird es als TT-MM-JJJJ- oder MM-TT-JJJJ-Format verstanden.
Simon
3
Wenn Sie es testen mit: echo date('Y-m-l', strtotime('01-01-2010'));Das Ergebnis ist 2010-01-Friday. Der Tag am Ende hängt also davon ab, wie Sie das Datumsformat für die dateFunktion angeben .
1
Während das, was Sie hier gepostet haben, korrekt ist und die Frage des Benutzers beantwortet, ist es ein Umweg, um das eigentliche Problem zu lösen. Damit strtotime () ein Datum im Format "TT / MM / JJ" richtig analysiert, müssen Sie das "/" durch "-" ersetzen. Daher brauchen Sie wirklich nur die ersten beiden Zeilen der Antwort: $date = '25/05/2010'; $date = str_replace('/', '-', $date); Die zusätzliche Zeile ist nicht erforderlich, um Ihr Problem zu lösen.
Gavin Coates
Dies ist nur korrekt, wenn der Tag> 12 ist: $ date = '1/2/34'; // 1. Februar 2034 Echo-Datum ('d M Y', strtotime ($ date)); // 02. Januar 2034
kurdtpage
Danke, Kumpel. Wirklich meinen Tag gemacht.
BEingprabhU
64

Sie können Datumsangaben aus einem benutzerdefinierten Format (ab PHP 5.3) mit analysieren DateTime :: createFromFormat analysieren

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

(Nebenbei: Die ! wird nicht angegebene Werte auf den Unix-Zeitstempel zurückgesetzt, dh die Zeit ist Mitternacht.)


Wenn Sie nicht wollen (oder können) verwenden PHP 5.3, dann eine vollständige Liste der verfügbaren Datums- / Zeitformate , die strtotime akzeptiert auf der aufgeführt ist Datumsformate Handbuch Seite. Diese Seite beschreibt ausführlicher die Tatsache, auf die geschlossen m/d/Ywird d/m/Y(aber Sie können, wie in den Antworten hier erwähnt, verwendend-m-Y , d.m.Yoder verwenden d\tm\tY).


In der Vergangenheit habe ich auch auf das str_replacein einer anderen Antwort erwähnte Quicky zurückgegriffen und die Datumszeichenfolge selbst in ein anderes Format wie analysiert

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

Dies ist eine gute Lösung für viele Probleme:

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
quelle
16

Aus der STRTOTIME-Beschreibung Hinweis:

Daten im m / d / y- oder dmy-Format werden durch Betrachten des Trennzeichens zwischen den verschiedenen Komponenten eindeutig: Wenn das Trennzeichen ein Schrägstrich (/) ist, wird das amerikanische m / d / y angenommen; Wenn das Trennzeichen ein Bindestrich (-) oder ein Punkt (.) ist, wird das europäische dmy-Format angenommen.

So einfach ist das.

L. Smit
quelle
Wir können das implementieren, da sie keinen Fehler geben, aber wenn ich es überprüft habe $tund $t1andere Ergebnisse zeige. Ich habe so nachgesehen. $t=strtotime(date('d-m-Y'));und $t1=strtotime(date('m/d/Y'));
vusan
3

am schnellsten sollte wohl sein

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

Dies gibt false zurück, wenn das Format nicht wie das richtige aussieht, aber nicht überprüft wird, ob das Datum gültig ist

Schädelknochen
quelle
2

Ich habe keine bessere Lösung gefunden. Sie können verwendet werden explode(), preg_match_all()usw.

Ich habe eine statische Hilfsfunktion wie diese

class Date {

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

    }

}

Es gibt wahrscheinlich einen besseren Namen dafür, aber ich benutze ihn, ausStrToTime()weil er mit australischen Daten funktioniert (mit denen ich mich oft beschäftige , wenn ich Australier bin). Ein besserer Name wäre wahrscheinlich der standardisierte Name, aber ich bin mir nicht sicher, was das ist.

Alex
quelle
2

Ich habe versucht, das ddmmyy-Format in das Format zu date("Y-m-d"konvertieren, aber es hat nicht funktioniert, als ich direkt bestanden habeddmmyy =date('dmy')

dann wurde klar, dass es also im Format JJJJ-MM-TT sein muss. verwendete Teilzeichenfolge zum Organisieren

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

dann weitergegeben an date("Y-m-d",strtotime($strParam));

es funktionierte!

smakintel.com
quelle
2

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

Dies wird für Sie funktionieren. Sie konvertieren den String in ein benutzerdefiniertes Datumsformat, in dem Sie PHP mitteilen können, welches Originalformat der String ihm gegeben wurde. Jetzt, da es sich um ein Datumsformat handelt, können Sie es in das Standard-Datumsformat von PHP konvertieren, das auch von MySQL verwendet wird.

Fi Horan
quelle
sauberste und feinste Lösung
Marco Marsala
1

Erhalten Sie diesen Wert aus einer Datenbank? Wenn ja, sollten Sie es in der Datenbank formatieren ( date_formatz. B. in MySQL). Wenn nicht, ist das Explodieren des Werts möglicherweise die beste Wahl, da strtotime die Werte für TT / MM / JJJJ einfach nicht zu schätzen scheint.

Joseph Mastey
quelle
1

Wenn Sie wissen, dass es in TT / MM / JJJJ ist, können Sie Folgendes tun:

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

Es werden Daten in der Form TT / M / JJ oder TT / MM / JJJJ (oder einer beliebigen Kombination aus beiden) abgeglichen ...

Wenn Sie mehr Trennzeichen als nur / unterstützen möchten, können Sie den regulären Ausdruck in Folgendes ändern:

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

Fügen Sie dann beliebige Zeichen in das [/-]Bit ein (Hinweis: Das Zeichen muss das letzte sein).

ircmaxell
quelle
Sicherlich sollte Ihr regulärer Ausdruck eher \dfür Dezimalstellen als [/d]für Schrägstriche oder d-Zeichen verwendet werden .
salathe
1

Diese Problemumgehung ist einfacher und eleganter als explodieren:

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

Sie müssen nicht wissen, in welchem ​​Format Sie das Datum erhalten, aber wenn es mit Schrägstrichen versehen ist, werden diese durch Punkt ersetzt und von strtotime als europäisch behandelt.

user2623027
quelle
0

Die einfachste Lösung ist folgende:

$date    = '07/28/2010';
$newdate = date('Y-m-d', strtotime($date));
simply_jhen
quelle
3
Das ist falsch. Die Frage bezieht sich explizit auf TT / MM / JJJJ-Eingaben.
Matt Fletcher
0

Dies ist die Lösung, die ich verwende, auch wenn die führende Null vorhanden ist.

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

 echo $date;
?>
Nandhini
quelle
0

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

nazmulhaqued
quelle
0

So einfach ist das

date('Y-m-d H:i:s', strtotime( str_replace('/', '-', $from_date ) ) );
Prajwol KC
quelle