Das Datum geht aber auch !
$_POST['datum']='42.19.2020'; $datum = date_create_from_format("d.m.Y", $_POST['datum']); if ($datum === FALSE) { // falsches Datum, Fehlermeldung }
Das kommt davon, dass date_create_from_format() intern mktime() benutzt. Damit kann man schöne Sachen berechnen wie den 34. Februar, den dann je nach Jahr auf dem richtigen Tag im März landet. Es ist eine tolle Funktion, kein Fehler.
Ich hatte schon gefragt, was denn, bitte, Deine Definition eines gültigen Datums sein soll.
So ist z.B. ein Topf ohne Deckel nach meiner Ansicht ein gültiger Topf. Es gibt aber Personen oder Einsatzfälle, wo das nicht zutrifft.
Das folgende Beispiel (für die Konsole¹) zeigt eine Prüfung auf eine formale Gültigkeit des Datums, gefolgt von zwei weiteren Prüfungen hinsichtlich einer Eingrenzung:
<?php
$dateFormat = 'd.m.Y'; #Format des Inputs
$s='02.02.2019'; # Der Input
$sNotBefore = '01.01.2020'; # Nicht vor
$sNotAfter = '31.12.2021'; # Nicht nach
#Zerlegen des Datums:
list( $d, $m, $y ) = explode( '.', $s, 3 );
#checkdate prüft formale Richtigkeit:
if ( checkdate ($m , $d , $y ) ) {
echo "Oha. Das Datum \"$s\" ist möglicherweise richtig und gültig. Ich prüfe mal weiter:" . PHP_EOL;
#Für die nachfolgenden Vergleiche werden die Strings in ein DateTime-Objekt umgewandelt:
$d = date_create_from_format( $dateFormat, $s );
$dNotBefore = date_create_from_format( $dateFormat, $sNotBefore );
$dNotAfter = date_create_from_format( $dateFormat, $sNotAfter );
# DieseDateTime-Objekte kann man vergleichen:
if ( $d > $dNotAfter ) {
echo "Schade. Das Datum $s sah gültig aus, liegt aber nach dem $sNotAfter." . PHP_EOL;
} elseif ( $d < $dNotBefore ) {
echo "Schade. Das Datum $s sah gültig aus, liegt aber vor dem $sNotBefore." . PHP_EOL;
} else {
echo "Bestätige: Gültiges Datum $s zwischen (einschließlich) $sNotBefore und $sNotAfter.". PHP_EOL;
}
} else {
echo "Ochnee. Das angebliche Datum \"$s\" ist schlicht ungültig." . PHP_EOL;
}
¹) Für die umständliche Ansicht via Webserver und Browser füge am Anfang header( 'Content-type: text/plain; charset=utf-8' );
hinzu. Dann speicher es aber auch in der Kodierung "UTF-8 ohne BOM".