2017-08-31 2 views
4
function validateDate($date, $format = 'm-Y') { 
    $d = DateTime::createFromFormat($format, $date); 
    return $d && $d->format($format) == $date; 
} 


validateDate('09-2017', 'm-Y'); 

Funktion wurde aus diesem answer oder php.net kopiertPHP Datetime CreateFromFormat Ausgabe

Ich bin sehr verwirrt, warum diese den Wert false zurück, während es für den Vormonaten true zurück. Irgendwelche Ideen?

Antwort

5

Das liegt daran, dass Sie keinen Tag angeben, daher wird der aktuelle Tag standardmäßig verwendet. Der aktuelle Tag ist 31, aber der September hat nur 30 Tage, also springt er bis zum 1. Oktober.

Schauen Sie sich das Beispiel:

function validateDate($date, $format = 'm-Y') { 
    $d = DateTime::createFromFormat($format, $date); 
    echo $d->format("d-".$format); // added the day for debugging 
    return $d && $d->format($format) == $date; 
} 
var_dump(validateDate('08-2017', 'm-Y')); // 31-08-2017, true 
var_dump(validateDate('09-2017', 'm-Y')); // 01-10-2017, there's no 31-09-2017, false 

Funktion von diesem Dies ist

answer oder php.net kopiert wurde ein wenig rudimentär, aber man kann erkennen, wenn es keine d im Format ist und manuell auf 1 setzen, um dies zu vermeiden:

<?php 
function validateDate($date, $format = 'm-Y') { 
    if (strpos($format, "d") === false) { 
     $format = "d ".$format; 
     $date = "01 ".$date; 
    } 
    $d = DateTime::createFromFormat($format, $date); 
    return $d && $d->format($format) === $date; 
} 
var_dump(validateDate('08-2017', 'm-Y')); // 31-08-2017, true 
var_dump(validateDate('09-2017', 'm-Y')); // 01-09-2017, true 
+0

Ahhhhh kopiert! Schöner Fang! Hervorragende Erklärung. Vielen Dank! :-) – theflarenet

+0

Es ist kein Problem! Ich fügte eine mögliche Lösung hinzu, die ich überhaupt nicht mochte, aber schau es dir an! – ishegg

+0

Schön! Ich liebe die schnelle Suche nach "d" innerhalb des Formats. Scheint wie der effizienteste Weg, es zu tun. – theflarenet

1

Wenn Sie keinen Tag liefern. der aktuelle wird verwendet; genau wie in der vorherigen Antwort erklärt. Aber das kann schnell mit einem Format-Zeichen gelöst werden: !, die alle Felder (Jahr, Monat, Tag, Stunde, Minute, Sekunde, Fraktion und Zeitzone Informationen) auf die Unix Epoch setzt; siehe format table.

Fix:

function validateDate($date, $format = 'm-Y') { 
    $d = DateTime::createFromFormat('!'.$format, $date); 
    return $d && $d->format($format) == $date; 
} 

Funktion wurde aus diesem answer oder php.net

+0

Wie wurde meine Funktion kopiert? Es sind zwei Codezeilen, um eine typische Datumsprüfung durchzuführen, und nicht einmal komplizierte Zeilen. Ich habe sogar einen Fehler gemacht lol. Gute Antwort, wusste nicht über '!', +1 Danke. – ishegg

Verwandte Themen