Ich erhalte eine Datumszeichenfolge von einer API, die wie folgt formatiert ist yyyy-mm-dd
.
Ich verwende derzeit einen regulären Ausdruck, um das Zeichenfolgenformat zu überprüfen. Dies funktioniert einwandfrei. In einigen Fällen kann es sich jedoch um ein korrektes Format gemäß der Zeichenfolge handeln, es handelt sich jedoch um ein ungültiges Datum. dh 2013-13-01
zum Beispiel.
Gibt es in PHP eine bessere Möglichkeit, eine Zeichenfolge wie z. B. 2013-13-01
festzustellen, ob es sich um ein gültiges Datum für das Format handelt oder nicht yyyy-mm-dd
?
Antworten:
Sie können
DateTime
class für diesen Zweck verwenden:[ Funktion aus dieser Antwort entnommen . Auch auf php.net . Ursprünglich geschrieben von Glavić . ]]
Testfälle:
Demo!
quelle
strtotime
Sie den Unix-Zeitstempel und danndate('Y-m-d', $t)
das Zeichenfolgendatum abrufen . Dann vergleichen Sie sie genau wie diese Antwort.strtotime
, benötigen Sie für nicht standardmäßige Formate,strtotime
die nicht erkannt werden, eine andere Lösung. Und für PHP Version 5.2 wurde die Unterstützung im Januar 2011 eingestellt, für 5.3 wurde die Unterstützung im August 2014 eingestellt.var_dump( validateDate('2012-2-9'));
'Y-n-j'
@reignsly lauten.$d
es nicht falsch sein wird, geben Sie ihm das Datum an, an dem Teile wie der 13. Monat (2013-13-01) übergelaufen sind. Aber es kommt wirklich darauf an, was Sie wollen. Wenn Sie zum BeispielvalidateDate('2015-55-66')
gültig sein müssen, müssen Sie nur prüfen, ob$d
es sich um ein Objekt handelt oder nicht.Bestimmen Sie, ob eine Zeichenfolge ein Datum ist
quelle
yyyy-mm-dd
.2015-02-30
als gültiges Datum angesehen wird, da PHP auf den nächsten Monat übertragen wird, wenn der angegebene Tag größer ist als die Anzahl der Tage im angegebenen Monat (oder negativ). Da das Datum garantiert das Formatyyyy-mm-dd
hat, kann dies durch Ändern der Rückgabe in behoben werdenreturn (bool)strtotime($myDateString) && date("Y-m-d", strtotime($myDateString)) == $myDateString;
.(bool)strtotime('s')
es als wahr heraus?$myDateString = str_replace("/", '-', $myDateString);
vor der Rückgabe verwenden, wenn die Datumszeichenfolge Schrägstriche (/) enthält, wie: - TT / MM / JJJJVerwenden Sie auf einfache Weise mit PHP vorgefertigten Funktion:
Prüfung
quelle
if
einfach intrue
oderfalse
zurück.return sizeof($tmpDate) == 3 && checkdate($tmpDate[1]...
2
,20
,202
,2020
oder auch wenn das Jahr20201
- gibt es jedes Mal wahr.Stellen Sie fest, ob die Zeichenfolge ein Datum ist, auch wenn die Zeichenfolge kein Standardformat ist
(strtotime akzeptiert kein benutzerdefiniertes Format)
quelle
if
geben Sie ihn einfach intrue
oder zurückfalse
, geben Sie den Test selbst zurück.Diese Option ist nicht nur einfach, sondern akzeptiert auch fast jedes Format, obwohl sie bei nicht standardmäßigen Formaten fehlerhaft sein kann.
quelle
202
eine negative Zahl zurück - die den Test noch besteht.Sie können auch das Datum für Monat, Datum und Jahr analysieren und dann die PHP-Funktion verwenden, über
checkdate()
die Sie hier lesen können: http://php.net/manual/en/function.checkdate.phpSie können auch dieses ausprobieren:
quelle
Der einfachste Weg, um zu überprüfen, ob das angegebene Datum gültig ist, besteht wahrscheinlich darin, es in Unixtime zu konvertieren
strtotime
, es in das Format des angegebenen Datums zu formatieren und es dann zu vergleichen:function isValidDate($date) { return date('Y-m-d', strtotime($date)) === $date; }
Natürlich können Sie reguläre Ausdrücke verwenden, um die Gültigkeit zu überprüfen, aber sie sind auf das angegebene Format beschränkt, jedes Mal, wenn Sie sie bearbeiten müssen, um andere Formate zu erfüllen, und sie sind mehr als erforderlich. Eingebaute Funktionen sind (in den meisten Fällen) der beste Weg, um Jobs zu erreichen.
quelle
checkdate()
- aber ich finde, dass das Checkdate fehlschlägt, wenn das Jahr einen beliebigen Wert hat:2, 20, 202, 2020, 20201
- Alle geben true zurück. Ich gehe mit Ihrer Lösung!Entsprechend der Antwort von cl-sah, aber das klingt besser, kürzer ...
Prüfung
quelle
count($tempDate) === 3
obwohlIch habe dieses Ding, das ich selbst mit PHP gerne funktionsfähig finde Lösungen . So ist zum Beispiel die Antwort von @migli wirklich gut, sehr flexibel und elegant.
Es gibt jedoch ein Problem: Was ist, wenn Sie viele DateTime-Zeichenfolgen mit demselben Format überprüfen müssen? Sie müssten das Format überall wiederholen, was gegen den DRY geht Prinzip . Wir könnten das Format in eine Konstante setzen, müssten aber dennoch die Konstante als Argument an jeden Funktionsaufruf übergeben.
Aber keine Angst mehr! Wir können Currying zu unserer Rettung verwenden! PHP macht diese Aufgabe nicht angenehm, aber es ist immer noch möglich, Currying mit PHP zu implementieren:
Also, was haben wir gerade gemacht? Grundsätzlich haben wir den Funktionskörper in eine anonyme Funktion eingeschlossen und stattdessen eine solche Funktion zurückgegeben. Wir können die Validierungsfunktion folgendermaßen aufrufen:
Ja, kein großer Unterschied ... aber die wahre Kraft kommt von der teilweise angewendeten Funktion , die durch Curry möglich wird:
Funktionsprogrammierung FTW!
quelle
Ich befürchte, dass die am häufigsten gewählte Lösung ( https://stackoverflow.com/a/19271434/3283279 ) nicht ordnungsgemäß funktioniert. Der vierte Testfall (var_dump (validateDate ('2012-2-25')); // false) ist falsch. Das Datum ist korrekt, da es dem Format entspricht - das m erlaubt einen Monat mit oder ohne führende Null (siehe: http://php.net/manual/en/datetime.createfromformat.php ). Daher hat ein Datum 2012-2-25 das Format Ymd und der Testfall muss wahr und nicht falsch sein.
Ich glaube, dass eine bessere Lösung darin besteht, mögliche Fehler wie folgt zu testen:
quelle
Wie wäre es mit diesem?
Wir verwenden einfach einen Try-Catch-Block.
Dieser Ansatz ist nicht nur auf ein Datums- / Zeitformat beschränkt, und Sie müssen keine Funktion definieren.
quelle
'0000-00-00 00:00:00'
ist ein gültiger Datum / Uhrzeit-Wert. Es ist nur der erste Wert. Die Datumseigenschaft des datetime-Objekts ist jedoch'-0001-11-30 00:00:00'
.Getestete Regex-Lösung:
Dies gibt null zurück, wenn das Datum ungültig ist oder nicht das Format JJJJ-MM-TT hat, andernfalls wird das Datum zurückgegeben.
quelle
Validieren Sie mit der Checkdate- Funktion:
quelle
quelle
quelle
Probieren Sie es aus:
quelle