HOWTO · PHP

Cómo obtener la diferencia de tiempo en minutos en PHP

Este artículo introduce cómo obtener la diferencia de tiempo en minutos en PHP. Incluye la función date_diff() y fórmulas matemáticas.

En esta página

Para calcular en minutos el tiempo transcurrido entre dos valores de fecha y hora de PHP, resta sus marcas de tiempo Unix y divide los segundos entre 60. Elige este método cuando necesites calcular una duración. Usa date_diff() si necesitas un intervalo de calendario y strtotime() si las entradas son cadenas que se pueden analizar. Mantén ambos valores en el mismo contexto de zona horaria y decide si el resultado debe conservar el sentido de la diferencia o ser una magnitud absoluta.

Calcular los minutos transcurridos a partir de marcas de tiempo

DateTimeImmutable hace explícitos los valores de entrada y evita modificar cualquiera de ellos durante el cálculo. Asigna una zona horaria a ambos valores; el ejemplo usa UTC. Restar las marcas de tiempo produce segundos transcurridos con signo: si el valor final es posterior al inicial, el resultado es positivo, y el signo depende del orden de la resta. Aplica abs() a la diferencia solo cuando el sentido no importe. Dividir entre 60 conserva los minutos fraccionarios; usa una función de redondeo únicamente si la aplicación requiere minutos enteros.

Ejecuta este ejemplo. La etiqueta de la salida se muestra en inglés porque el bloque de código se conserva sin cambios:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

<?php
$timezone = new DateTimeZone('UTC');
$start = new DateTimeImmutable('2024-06-16 09:15:00', $timezone);
$end = new DateTimeImmutable('2024-06-16 10:00:00', $timezone);

$elapsedMinutes = ($end->getTimestamp() - $start->getTimestamp()) / 60;
echo "Elapsed minutes: $elapsedMinutes\n";

Para calcular el tiempo realmente transcurrido durante los cambios al horario de verano, usa las marcas de tiempo de valores de fecha y hora con la zona horaria prevista. En una zona horaria que aplica el horario de verano, no supongas que cada día del calendario contiene exactamente 1.440 minutos transcurridos.

Usar date_diff() para calcular diferencias entre fechas del calendario

date_diff() (también disponible como $start->diff($end)) devuelve un DateInterval, no un único recuento de minutos transcurridos. Sus componentes de días, horas y minutos son útiles cuando la pregunta se plantea en términos de calendario, por ejemplo: «¿Cuántos días, horas y minutos de diferencia hay?». La propiedad invert del intervalo indica el sentido cuando el valor final es anterior al inicial; el argumento absolute puede suprimir ese sentido.

La salida del ejemplo muestra en inglés los nombres de las unidades porque el bloque de código se conserva sin cambios.

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

<?php
$timezone = new DateTimeZone('UTC');
$start = new DateTimeImmutable('2024-06-16 09:15:00', $timezone);
$end = new DateTimeImmutable('2024-06-18 12:30:00', $timezone);

$interval = date_diff($start, $end);
echo $interval->format('%R%a days, %h hours, and %i minutes');

Para un intervalo de calendario, puedes obtener un recuento nominal de minutos a partir de sus componentes con $interval->days * 1440 + $interval->h * 60 + $interval->i. Esto combina días del calendario con componentes del reloj; no sustituye a la resta de marcas de tiempo cuando necesitas calcular los minutos exactos transcurridos durante transiciones de zona horaria. Si el sentido importa, conserva el signo del intervalo o aplícalo a la magnitud calculada mediante $interval->invert.

Analizar cadenas de hora con strtotime()

strtotime() convierte una cadena de fecha y hora que se pueda analizar en una marca de tiempo Unix. Una cadena que solo contiene una hora se interpreta en relación con un contexto de fecha, así que proporciona fechas completas cuando los valores puedan cruzar la medianoche o corresponder a fechas distintas. Establece explícitamente la zona horaria predeterminada (o incluye una zona horaria en cada cadena) para que ambas marcas de tiempo usen el contexto previsto. La resta conserva el signo del resultado; usa abs() para obtener una duración sin signo.

Ejecuta este ejemplo. La etiqueta de la salida se muestra en inglés porque el bloque de código se conserva sin cambios:

El código y las etiquetas o salidas visibles de esta sección se mantienen en inglés.

<?php
date_default_timezone_set('UTC');
$start = strtotime('2024-06-16 23:30:00 UTC');
$end = strtotime('2024-06-17 00:15:00 UTC');

$minutes = ($end - $start) / 60;
echo "Elapsed minutes: $minutes\n";

Al analizar entradas no confiables o variables, comprueba que cada llamada haya devuelto una marca de tiempo antes de restar: el análisis puede fallar y devolver false. Para datos de aplicaciones que requieran una gestión clara de la zona horaria, es preferible crear valores DateTimeImmutable con una zona horaria explícita. Usa strtotime() para analizar cadenas de forma concisa, resta marcas de tiempo para calcular una duración transcurrida y usa date_diff() cuando necesites describir el propio intervalo de calendario.