php funcionalidad DateTime createFromFormat

Hola, parece que tengo problemas para lograr que el método datetime funcione como se esperaba. Puedo estar haciendo algo mal?

// 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

Lo que DateTime::createFromFormat con DateTime::createFromFormat es que reconoce dos tipos de entradas inesperadas: el tipo que genera errores y el tipo que genera advertencias.

La entrada como '56/56/fail' produce un error, por lo que se devuelve false y todo está bien. Sin embargo, '56/56/2012' no da un error, sino una advertencia, y en realidad se analiza como el 56º día del 56º mes de 2012. Como 2012 no tiene 56 meses, PHP lo cambia internamente a 2016 + 8 meses = Agosto de 2016. Y como ese mes no tiene 56 días, tenemos otra compensación hasta septiembre de 2016 + (56 – 31) días = 25 de septiembre de 2016. Entonces, aunque inesperado, esto es correcto.

Si no desea permitir este ajuste automático, debe ajustar el método de fábrica DateTime y usar DateTime::getLastErrors como referencia:

 $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"; } 

Véalo en acción .

En realidad, esto es correcto: por ejemplo, si creas una fecha con el 31/04/2012 (fecha no válida), PHP devuelve el 05/05/2012 (primer día de mayo).

Esto se hace detrás de la escena

PHP es una bestia extraña (por decir lo menos). 56/56/2012 da 56/56/2012 resultado todos los meses y días adicionales que se agregarán a la fecha hasta que sean correctos (Dios solo conoce la lógica detrás de esto).