Ist Zend_Date::isDate() wirklich so schlecht?
Habe heute morgen in meinem Feedreader einen Verriss zur Funktion Zend_Date::isDate() gefunden. Michael geht mit dieser Funktion dabei sehr hart ins Gericht, weil sie nicht genau das macht, was er erwartet. Er übergibt Datumsangaben und versucht diese anhand eines Fortmats auf Gültigkeit zu überprüfen. Ich habe das beanstandete Verhalten einmal versucht nach zustellen.
PHP:
-
Zend_Debug::dump(Zend_Date::isDate('31.10.1972'));
-
Zend_Debug::dump(Zend_Date::isDate('31.10.1972', 'y-m-d'));
-
Zend_Debug::dump(Zend_Date::isDate('31.10.1972', 'd.m.y'));
-
Zend_Debug::dump(Zend_Date::isDate('1111', 'd.m.y'));
-
Zend_Debug::dump(Zend_Date::isDate('01/2009'));
-
Zend_Debug::dump(Zend_Date::isDate('01/2009', 'm.d'));
-
Zend_Debug::dump(Zend_Date::isDate('01/2009', 'm/y'));
-
Zend_Debug::dump(Zend_Date::isDate('1111', 'm/y'));
Und in der Tat wird die Übergabe von '1111' jeweils als true erkannt. Das ist auch für mich etwas unerwartet. Was haltet ihr davon?

Dienstag, 20.10.2009, um 09:20
Uff, ein wenig eigenartig ist das schon, aber ich bin sicher, das Thomas Weidner dafür eine eindeutige Erklärung parat hat, warum das so ist und warum das so sein muss. Ich hoffe, er meldet sich hier zu Wort :)
Dienstag, 20.10.2009, um 09:52
Hi,
Kannst du zu deinem Code auch noch die Ergebnisse posten oder sind das (wie ich erwarten würde) alles "true" Fälle? Mein Fall (isDate('03.2009','M/yyyy')) fehlt übrigens noch ;-)
Wie in meinem Artikel schon beschrieben wurde das Verhalten in einem offiziellen Zend Bug schon erklärt. http://framework.zend.com/issues/browse/ZF-7583
Aber leider nicht so wie ich es erhofft hatte ("oh ja, das ist ein Bug, wird schnell korrigiert") sondern eher das Gegenteil ("das ist so gewollt, lebt damit")
Dienstag, 20.10.2009, um 10:11
@ Michael,
die Ergebnisse sind wie folgt:
bool(false)
bool(false)
bool(true)
bool(true)
bool(false)
bool(false)
bool(true)
bool(true)
Dienstag, 20.10.2009, um 11:04
Das Problem ist, dass Zend_Locale_Format::getDate mit der 1111 und dem übergebenen Format ein Datum parst und keine Exception wirft.
Heraus kommt Tag 11, Minute 11, Jahr 0.
Das "m" im Format intepretiert die Funktion isDate als Minute, nicht als Monat. Und da alle Variablen (Tag, Minute, Jahr) gesetzt sind, ist das Ergebnis wahr.
Dienstag, 20.10.2009, um 11:13
ich frage mich ja immer noch warum mein Originalfall eigentlich nicht false wirft.
Denn "M/yyyy" sagt ja laut Manual dass ich einen Monat (1-2 stellig) ("M") und danach ein vierstelliges Jahr ("yyyy") haben will, getrennt durch Slash ("/"). Warum ging dann der Text "03.2009" auch durch?
Dienstag, 20.10.2009, um 11:47
Die Funktion _parseDate in Zend_Locale_Format ignoriert offensichtlich das Trennzeichen gänzlich. Du könntest auch "03&2009" hernehmen. Ich denke die _parseDate müsste mal angefasst werden, das diese mehr Exceptions wirft.
Freitag, 11.12.2009, um 18:45
Jo dieser Validator is echt verwirrend, hab mir den Quellcode angeschaut und verstehe nicht was die funktion macht, hier ein Auszug:
$date = '31.10.1972';
unset($date);
$isDate = rand(0, 1);
if ($isDate) {
return true;
} else {
return false;
}