Diferencia entre fechas en PHP: 5 enfoques de lo simple a lo profesional

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Cómo calcular la diferencia entre dos fechas en PHP: de principiante a profesional

\n\n

¿Alguna vez te has preguntado: «¿Cuántos días han pasado desde mis últimas vacaciones?» o «¿En cuántas horas terminará la promoción en el sitio web?»? Si eres desarrollador PHP, estas preguntas se convierten en una tarea: cómo calcular la diferencia entre dos fechas.

\n\n

Esta pregunta es una de las más populares en Stack Overflow con miles de visitas. Y no es casualidad: trabajar con fechas en PHP puede ser engañoso. Años bisiestos, zonas horarias, diferentes formatos: todo esto puede romper incluso el código más cuidadosamente diseñado.

\n\n

En este artículo, analizaremos 5 formas probadas de calcular la diferencia entre fechas en PHP, desde las más simples hasta las profesionales. Aprenderás cuándo usar cada método y obtendrás ejemplos de código listos para usar.

\n\n

1. Método clásico: strtotime() y aritmética simple

\n\n

La forma más antigua e intuitiva es convertir las fechas a marcas de tiempo Unix (timestamp) usando la función strtotime() y simplemente restar un número del otro.

\n\n
<?php\n$date1 = strtotime('2024-01-15');\n$date2 = strtotime('2024-03-20');\n\n$diff_seconds = $date2 - $date1;\n$diff_days = floor($diff_seconds / (60 * 60 * 24));\n\necho "Diferencia en días: " . $diff_days; // Mostrará: 65\n?>
\n\n

Ventajas: simplicidad, funciona en cualquier versión de PHP.

\n

Desventajas: no tiene en cuenta las zonas horarias, problemas con fechas anteriores a 1970, no hay soporte incorporado para meses y años (ya que su duración varía).

\n\n

Este método es adecuado para cálculos rápidos «sobre la marcha», pero para proyectos serios es mejor usar herramientas más modernas.

\n\n

2. Estándar moderno: clase DateTime y método diff()

\n\n

A partir de PHP 5.2, tenemos la potente clase DateTime. Esta es una verdadera navaja suiza para trabajar con fechas. El método diff() devuelve un objeto DateInterval que contiene toda la información sobre la diferencia.

\n\n
<?php\n$date1 = new DateTime('2024-01-15');\n$date2 = new DateTime('2024-03-20');\n\n$interval = $date1->diff($date2);\n\necho "Diferencia: " . $interval->days . " días"; // 65\necho "o " . $interval->m . " meses y " . $interval->d . " días"; // 2 meses y 5 días\n?>
\n\n

DateInterval da acceso a las siguientes propiedades:

\n
    \n
  • y — años
  • \n
  • m — meses
  • \n
  • d — días
  • \n
  • h — horas
  • \n
  • i — minutos
  • \n
  • s — segundos
  • \n
  • days — número total de días (¡lo más útil!)
  • \n
  • invert — indicador: 0 si la primera fecha es anterior, 1 si es posterior
  • \n
\n\n

Este método tiene en cuenta los años bisiestos y funciona correctamente con diferentes peculiaridades del calendario. Es el recomendado en la documentación oficial de PHP.

\n\n

3. Formateo de la diferencia: cómo mostrar «2 años 3 meses 10 días»

\n\n

A menudo no solo necesitas obtener un número, sino formatear la diferencia de forma atractiva para el usuario. El método format() del objeto DateInterval viene al rescate.

\n\n
<?php\n$birthday = new DateTime('1990-05-15');\n$today = new DateTime();\n\n$age = $birthday->diff($today);\n\necho $age->format('%y años %m meses %d días');\n// Ejemplo: 34 años 2 meses 3 días\n?>
\n\n

Especificadores de formato:

\n
    \n
  • %y — años
  • \n
  • %m — meses
  • \n
  • %d — días
  • \n
  • %h — horas
  • \n
  • %i — minutos
  • \n
  • %s — segundos
  • \n
  • %a — número total de días (alternativa a days)
  • \n
  • %r — signo "menos" si la diferencia es negativa
  • \n
\n\n

¿Quieres la declinación de las palabras «día/días»? Tendrás que escribir tu propia lógica

Blogs

Book Recommendations