Intentando mostrar la diferencia entre dos fechas en PHP.
<?php $date1 = new DateTime("2022-03-01"); $date2 = new DateTime("2022-04-01"); $interval = $date1->diff($date2); echo $interval->days; echo "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days "; ?>
Estoy obteniendo resultados como: -
31diferencia 0 años, 1 mes, 3 días
El resultado $interval->days
es correcto, pero ¿por qué tener $interval->d
como 3 cuando es solo una diferencia de un mes?
Prueba a continuación
<?php $date1 =DateTime::createFromFormat("Ymd", "2022-03-01"); $date2 =DateTime::createFromFormat("Ymd", "2022-04-01"); $interval = $date1->diff($date2); echo $interval->days; echo " \ndifference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days "; ?>
Parece un error, eso depende de la zona horaria y la hora.
Con la zona horaria UTC, está bien:
$date1 = new DateTime("2022-03-01 00:00", new DateTimeZone("UTC")); $date2 = new DateTime("2022-04-01 00:00", new DateTimeZone("UTC"));
diferencia 0 años, 1 meses, 0 días
Con la zona horaria de Europa/Berlín a la medianoche, tenemos el desfase de 3 días:
$date1 = new DateTime("2022-03-01 00:00", new DateTimeZone("Europe/Berlin")); $date2 = new DateTime("2022-04-01 00:00", new DateTimeZone("Europe/Berlin"));
diferencia 0 años, 1 mes, 3 días
A la 01:00 de la mañana, todo está bien: 0 meses pero 31 días
$date1 = new DateTime("2022-03-01 01:00", new DateTimeZone("Europe/Berlin")); $date2 = new DateTime("2022-04-01 01:00", new DateTimeZone("Europe/Berlin"));
0 años, 0 meses, 31 días
A las 12:00, todo vuelve a estar bien: 1 mes
$date1 = new DateTime("2022-03-01 12:00", new DateTimeZone("Europe/Berlin")); $date2 = new DateTime("2022-04-01 12:00", new DateTimeZone("Europe/Berlin"));
0 años, 1 mes, 0 días