2012-04-12 15 views
6

Hallo, ich habe Probleme, die Datetime-Methode wie erwartet funktionieren zu lassen? Vielleicht mache ich etwas falsch?php DateTime createFromFormat Funktionalität

// Passes OK 
$dateTime = DateTime::createFromFormat('d/m/Y', '12/12/2012'); 
var_dump($dateTime); 

// should fail but returns - 2016-09-25 
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012'); 
var_dump($dateTime); 

// correctly returns False 
$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/fail'); 
var_dump($dateTime); 

// should fail but returns 2019-08-29 09:58:10 
$dateTime = DateTime::createFromFormat('m/d/Y', '90/90/2012'); 
var_dump($dateTime); 

enter image description here

Antwort

30

Die Sache über DateTime::createFromFormat ist, dass es zwei Arten von unerwartetem Eingang ist es erkennt: die Art, die Fehler erzeugt, und die Art, die Warnungen generiert.

Eingabe wie '56/56/fail' erzeugt einen Fehler, so false zurückgegeben wird und alles ist gut. '56/56/2012' gibt jedoch keinen Fehler, sondern eine Warnung und wird tatsächlich als der 56. Tag des 56. Monats 2012 geparst. Da 2012 keine 56 Monate hat, ändert PHP dies intern zu 2016 + 8 Monaten = August 2016. Und seit dem Monat hat keine 56 Tage, wir haben eine andere Entschädigung bis September 2016 + (56 - 31) Tage = 25 September 2016. So unerwartet ist dies in der Tat richtig.

Wenn Sie diese automatische Anpassung an nicht zulassen wollen, müssen Sie die DateTime Factory-Methode wickeln und DateTime::getLastErrors als Referenz verwenden:

$dateTime = DateTime::createFromFormat('d/m/Y', '56/56/2012'); 
$errors = DateTime::getLastErrors(); 
if (!empty($errors['warning_count'])) { 
    echo "Strictly speaking, that date was invalid!\n"; 
} 

See it in action.

+0

Danke für die Antwort. War 100% Spot und sehr gut erklärt. –

+0

Für die Prüfung bereit sein, um es für das Kopieren/Einfügen als auch die erste Kontrolle haben sollte: if (! $ Datums- und Uhrzeit || empty ($ fehler [ 'warning_count'])) { :) –

1

Eigentlich ist das richtig: Zum Beispiel, wenn Sie ein Datum mit 2012.04.31 (ungültigem Datum) PHP gibt 2012.05.01 (ersten Tag im Mai) erstellt!

Dies wird hinter den Kulissen

1

PHP ist ein seltsames Biest (gelinde gesagt). 56/56/2012 führt dazu, dass alle zusätzlichen Monate und Tage dem Datum hinzugefügt werden, bis es korrekt ist (Gott kennt nur die Logik dahinter).

+1

ich vermute, Logik ist, dass es den Programmierer einige faul Datum Kalkulationen machen lässt. Wenn Sie 90 Tage oder 18 Monate zu etwas hinzufügen möchten, können Sie einfach die Zahlen dort einmischen, ohne die Kalkulation zu machen, die Monate/Jahre selbst zu verpacken, usw., und PHP wird es für Sie sortieren und zurückgeben, was Sie wollen. –

Verwandte Themen