(PHP 5 >= 5.3.0, PHP 7, PHP 8)
DateTimeInterface::diff -- DateTimeImmutable::diff -- DateTime::diff -- date_diff — Devuelve la diferencia entre dos objetos DateTime
Estilo orientado a objetos
$targetObject
, bool $absolute
= false
): DateInterval$targetObject
, bool $absolute
= false
): DateIntervalEstilo por procedimientos
$baseObject
, DateTimeInterface $targetObject
, bool $absolute
= false
): DateIntervalDevuelve la diferencia entre dos objetos DateTimeInterface.
datetime
La fecha a comparar.
absolute
¿Debería el intervalo forzado a ser positivo?
El objeto DateInterval que representa la diferencia entre dos fechas.
El parámetro absolute
solo afecta
a la propiedad invert
de un
objeto DateInterval.
El valor devuelto más especificamente, representa el intervalo de tiempo
que habría que aplicar al objeto original ($this
o
$originObject
) para llegar a
$targetObject
. Este proceso no siempre es
reversible.
El método tiene en cuenta los cambios de horario de verano y, por lo tanto,
puede devolver un intervalo de 24 horas y 30 minutos
,
como en uno de los ejemplos. Si quieres calcular un tiempo absoluto,
debes comvertir ambos $this
/$baseObject
,
y $targetObject
primero a UTC.
Ejemplo #1 Ejemplo de DateTime::diff()
Estilo orientado a objetos
<?php
$origin = new DateTimeImmutable('2009-10-11');
$target = new DateTimeImmutable('2009-10-13');
$interval = $origin->diff($target);
echo $interval->format('%R%a days');
?>
Estilo por procedimientos
<?php
$origin = date_create('2009-10-11');
$target = date_create('2009-10-13');
$interval = date_diff($origin, $target);
echo $interval->format('%R%a days');
?>
El resultado de los ejemplos sería:
+2 days
Ejemplo #2 DateTimeInterface::diff() durante el cambio de horario de verano
<?php
$originalTime = new DateTimeImmutable("2021-10-30 09:00:00 Europe/London");
$targetTime = new DateTimeImmutable("2021-10-31 08:30:00 Europe/London");
$interval = $originalTime->diff($targetTime);
echo $interval->format("%H:%I:%S (Días completos: %a)"), "\n";
?>
El resultado del ejemplo sería:
24:30:00 (Días completos: 0)
Ejemplo #3 DateTimeInterface::diff() range
El valor devuelto es la cantidad de tiempo exacto entre
$this
y $targetObject
.
Comparando del 1 de enero al 31 de diciembre devuelve 364 días,
y no 365 (para años no bisiestos).
<?php
$originalTime = new DateTimeImmutable("2023-01-01 UTC");
$targetTime = new DateTimeImmutable("2023-12-31 UTC");
$interval = $originalTime->diff($targetTime);
echo "Días completos: ", $interval->format("%a"), "\n";
?>
El resultado del ejemplo sería:
Días completos: 364
Ejemplo #4 Comparación de objetos DateTime
Nota:
Los objetos DateTime se pueden comparar usando los operadores de comparación.
<?php
$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");
var_dump($date1 == $date2);
var_dump($date1 < $date2);
var_dump($date1 > $date2);
?>
El resultado del ejemplo sería:
bool(false) bool(true) bool(false)