2012-04-12 15 views
6

Hola ¿Parece que tengo problemas para lograr que el método datetime funcione como se esperaba? Puedo estar haciendo algo mal?php Funcionalidad DateTime createFromFormat

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

Respuesta

30

Lo que pasa DateTime::createFromFormat es que hay dos tipo de entrada inesperada reconoce: el tipo que genera errores, y el tipo que genera advertencias.

Entrada como '56/56/fail' produce un error, por lo que se devuelve false y todo está bien. Sin embargo, '56/56/2012' no muestra un error, sino una advertencia, y en realidad se analiza como el día 56 del 56º mes de 2012. Como 2012 no tiene 56 meses, PHP lo cambia internamente a 2016 + 8 meses = agosto de 2016. Y desde entonces el 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, de hecho, correcto.

Si quiere desactivar este ajuste automático, hay que envolver el método DateTime fábrica y utilizar como referencia DateTime::getLastErrors:

$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

Gracias por la respuesta. Fue 100% puntual y muy bien explicado. –

+0

Para la comprobación para estar listo para copiar/pegar deben tener la comprobación inicial, así: if (! $! FechaHora || empty ($ errores [ 'warning_count'])) { :) –

1

En realidad esto es correcto: Por ejemplo, si crea una cita con 04.31.2012 (fecha no válida) PHP vuelve 2012/05/01 (primer día de mayo)!

Esto se hace detrás de las escenas

1

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

+1

Sospecho que la La lógica es que le permite al programador hacer calcos de fecha perezosa. Si desea agregar 90 días o 18 meses a algo, puede ingresar los números allí sin hacer los cálculos, ajustando los meses/años usted mismo, etc., y PHP lo resolverá y devolverá lo que desee. –

Cuestiones relacionadas