Cómo calcular la diferencia entre dos fechas en PHP: guía completa con ejemplos
\n\n¿Alguna vez te has preguntado «¿cuántos días han pasado desde que el usuario se registró?», «¿qué edad tiene alguien según su fecha de nacimiento?» o «¿cuántas horas faltan para que termine la promoción?»? Si es así, seguro que te has enfrentado a la pregunta: ¿cómo calcular la diferencia entre dos fechas en PHP? Es una de las consultas más populares en Stack Overflow, y con razón: trabajar con fechas es un tema básico pero traicionero.
\n\nEn este artículo, analizaremos tres enfoques principales: el clásico strtotime(), el moderno orientado a objetos DateTime y el potente paquete de terceros Carbon. No solo aprenderás «cómo hacerlo», sino también qué método elegir según tu necesidad. ¡Vamos allá!
¿Por qué restar fechas directamente es una mala idea?
\n\nLos desarrolladores novatos suelen intentar algo así:
\n\n<?php\n$fecha1 = '2024-01-15';\n$fecha2 = '2024-01-10';\n$diferencia = $fecha2 - $fecha1; // ¡Error! No se pueden restar strings\n?>\n\n\nPHP no sabe restar strings, aunque parezcan fechas. El resultado será 0 o una advertencia. Incluso si usas strtotime() y obtienes marcas de tiempo Unix, una simple resta de segundos te dará solo la cantidad de segundos, no un formato útil como «2 días, 3 horas y 15 minutos». Para eso necesitas herramientas especiales.
Enfoque 1: El clásico — strtotime() y cálculos manuales
\n\nEste método lo conocen todos los que empezaron con PHP 4 o 5. La función strtotime() convierte una representación textual de fecha en una marca de tiempo Unix (cantidad de segundos desde el 1 de enero de 1970). Luego restamos las marcas y dividimos entre la cantidad de segundos en un día.
Ejemplo: diferencia en días
\n\n<?php\n$fecha1 = strtotime('2024-12-25');\n$fecha2 = strtotime('2024-12-20');\n\n$diferencia_segundos = $fecha1 - $fecha2;\n$diferencia_dias = floor($diferencia_segundos / (60 * 60 * 24));\n\necho "Diferencia: $diferencia_dias días"; // Muestra: Diferencia: 5 días\n?>\n\n\nVentajas: simplicidad, no requiere objetos, funciona rápido.
\n\nDesventajas:
\n- Sin soporte de zonas horarias (siempre UTC).
\n- Al cambiar a horario de verano/invierno, puede haber un error de 1 hora (y por tanto de 1 día, si el cambio cae en tu intervalo).
\n- Para obtener la diferencia en meses o años, necesitas lógica compleja que considere años bisiestos.
Cuándo usarlo: solo para cálculos aproximados (por ejemplo, «¿han pasado más de 30 días?») o si tienes una base de código antigua.
\n\nEnfoque 2: DateTime y DateInterval — el estándar moderno de PHP
\n\nA partir de PHP 5.2, el lenguaje incorporó la potente clase DateTime. Junto con DateInterval, resuelve el 95% de las tareas relacionadas con fechas. Esta es la forma recomendada para calcular la diferencia entre dos fechas en PHP.
Ejemplo básico: diferencia en días, meses y años
\n\n<?php\n$fecha1 = new DateTime('2024-01-15');\n$fecha2 = new DateTime('2023-11-10');\n$intervalo = $fecha1->diff($fecha2);\n\necho $intervalo->format('%y años, %m meses, %d días');\n// Muestra: 0 años, 2 meses, 5 días\n?>\n\n\nLa magia está en que diff() considera automáticamente los años bisiestos, los diferentes días en los meses e incluso las zonas horarias (si están configuradas).
Accediendo a componentes individuales
\n\n<?php\n$fecha1 = new DateTime('2024-12-25');\n$fecha2 = new DateTime('2024-01-01');\n$intervalo = $fecha1->diff($fecha2);\n\necho "Años: " . $intervalo->y . "<br>";\necho "Meses: " . $intervalo->m . "<br>";\necho "Días: " . $intervalo->d . "<br>";\necho "Total de días: " . $intervalo->days . "<br>";\n// Muestra:\n// Años: 0\n// Meses: 11\n// Días: 24\n// Total de días: 359\n?>\n\n\nObserva la propiedad days: es el número total de días en el intervalo (a diferencia de d, que muestra