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
Ahhhhh kopiert! Schöner Fang! Hervorragende Erklärung. Vielen Dank! :-) – theflarenet
Es ist kein Problem! Ich fügte eine mögliche Lösung hinzu, die ich überhaupt nicht mochte, aber schau es dir an! – ishegg
Schön! Ich liebe die schnelle Suche nach "d" innerhalb des Formats. Scheint wie der effizienteste Weg, es zu tun. – theflarenet