PHP Prüfen, Datum korrekte Formatierung?

Dsimon24

Lieutenant
Registriert
Aug. 2016
Beiträge
595
Hallo zusammen,

wie kann ich am besten prüfen, ob eine variable ein
gültiges Datum im Format YYYY-MM-DD enthält?

Darüber hinaus, kann man das auch direkt in
phpMyAdmin prüfen?

VG, David
 
Zuletzt bearbeitet:
mit preg_match und regex..... :-)

so in etwa:

PHP:
<?php

$test = "2019-10-31";
$reg = "/^([0-9+]{4})-([0-9+]{2})-([0-9+]{2})$/";

if(preg_match($reg,$test,$match)) {
    
    if(checkdate($match[2],$match[3],$match[1])) {
        echo "Das Datum $test ist im richtigen Format und gültig.";
    } else echo "Das Datum $test ist ungültig.";

    
} else echo "Datumsformat falsch. YYYY-MM-DD";
 
Zuletzt bearbeitet: (Code geändert!)
Mit Regex ist das sehr aufwändig.

Das hier ist recht elegant und sicher:

Code:
function test_date($datestr){
    list($y, $m, $d) = array_pad(explode('-', $datestr, 3), 3, 0);
    return ctype_digit("$y$m$d") && checkdate($m, $d, $y);
}

//Beispiele zum testen
var_dump( test_date("2019-02-30"));//false
var_dump( test_date("2019-02-27"));//true


Zum Rumfummeln am Code kann man ganz gut das hier nehmen: http://phptester.net/
 
  • Gefällt mir
Reaktionen: new Account()
Hier nochmal das Selbe wie oben, nur etwas praktischer:

PHP:
$test = "2019-10-31";
$reg = "/^([0-9+]{4})-([0-9+]{2})-([0-9+]{2})$/";


if(preg_match($reg,$test,$match) && checkdate($match[2],$match[3],$match[1])) echo "valid";
else echo "invalid";
 
@Hugo Stiglitz
Das "+"-Zeichen in deinen Zeichengruppen ist unnötig bzw. kann sogar dafür sorgen, dass fehlerhafte Eingaben als korrekt eingestuft werden.
 
  • Gefällt mir
Reaktionen: BeBur
Also der sinnvolle regexp ausdruck dazu lautet ja so:^\d{4}-\d{2}-\d{2}$
Mit Gruppen im regexp zu arbeiten ist unnötig, man schaut einfach ob der string zum obigen regexp passt.
Wenn das Format in diesem spezifischen Format eingegeben werden soll ist regexp der mit abstand sinnigste weg. Außerdem ziemlich simpel, wie man sieht.
 
BeBur schrieb:
Also der sinnvolle regexp ausdruck dazu lautet ja so:^\d{4}-\d{2}-\d{2}$

Würde aber dazu führen, dass 9999-99-99 als gültig anerkannt wird.
Das Format wäre natürlich gültig, das Datum allerdings nicht.

Ich würde den Weg von @Sparta8 befürworten mittels der DateTime-Klasse zu realisieren.
 
  • Gefällt mir
Reaktionen: new Account() und BeBur
Fusion.Tio schrieb:
Würde aber dazu führen, dass 9999-99-99 als gültig anerkannt wird.
Das Format wäre natürlich gültig, das Datum allerdings nicht.

Ich würde den Weg von @Sparta8 befürworten mittels der DateTime-Klasse zu realisieren.
Absolut korrekt. Falls man (warum auch immer) ein bestimmtes Format bei der Eingabe erzwingen will könnte man das allerdings mit einem regexp kombinieren.
 
BeBur schrieb:
Also der sinnvolle regexp ausdruck dazu lautet ja so:^\d{4}-\d{2}-\d{2}$
Mit Gruppen im regexp zu arbeiten ist unnötig, man schaut einfach ob der string zum obigen regexp passt.
Wenn das Format in diesem spezifischen Format eingegeben werden soll ist regexp der mit abstand sinnigste weg. Außerdem ziemlich simpel, wie man sieht.
Nein. Der RegExp alleine reicht nicht.
Du brauchst die Gruppen um die drei Parameter für checkdate angeben zu können.

Ohne checkdate würde er zum Beispiel ein 2019-99-99 fressen. Oder noch schwieriger: 2019-02-29
 
Haggis schrieb:
Nein. Der RegExp alleine reicht nicht.
Du brauchst die Gruppen um die drei Parameter für checkdate angeben zu können.

Ohne checkdate würde er zum Beispiel ein 2019-99-99 fressen. Oder noch schwieriger: 2019-02-29

deshalb hab ichs ja kombiniert...
 
Haggis schrieb:
Aber wie genau?
Wenn man das einfach nur benutzt, kriegt man z.B. aus einem 30.2. einfach den 3. März.

Interessanter Punkt..
Dachte nicht, dass er das einfach so ausspuckt. :confused_alt:

da scheint wirklich nur die Kombi aus RegEx und checkdate zu helfen.
 
Zuletzt bearbeitet:
Man könnte mit DateTime das geparste Datum wieder im gleichen Format ausgeben und anschließend vergleichen, ob das identisch mit der Eingabe ist...
 
Was ist den an RegEx und checkdate so verkehrt? Ich finde, dass ist eine solide Lösung.....
 
Verkehrt ist daran nichts.
Die DateTime-Funktion wäre meiner Meinung nach eleganter gewesen.

Da die Funktion aber einfach den "Überhang" an Monaten oder Tagen, einfach dazu addiert, ist die Lösung mit RegEx und checkdate die beste.
 
Was soll denn der Quatsch mit dem Regex? Ein Datum hat kein regelmäßiges Format, schon allein wegen Schaltjahren. Nimm checkdate() wenn dir die Datumsteile vorliegen, oder strtotime(), das liefert auch ggf. false zurück und kann noch weit mehr Formate.
 
chorn schrieb:
Was soll denn der Quatsch mit dem Regex? Ein Datum hat kein regelmäßiges Format, schon allein wegen Schaltjahren. Nimm checkdate() wenn dir die Datumsteile vorliegen
Hugo nimmt regex weil er die Datumsteile haben will.

chorn schrieb:
oder strtotime(), das liefert auch ggf. false zurück und kann noch weit mehr Formate.
Strtotime ist da sicher keine gute Idee. Eben weil es alle möglichen Formate zu erraten versucht.

Es liefert Dir zum Beispiel bei "2000" oder "2000-1" einen Wert. Oder auch bei unserem Klassiker "2019-02-30"
 
Zurück
Oben