php8.5
Home/ Manual/ datetime / datetimeinterface/ DateTimeInterface::diff

DateTimeInterface::diff

PHP function Edit on GitHub ✎

(PHP 5 >= 5.3.0, PHP 7, PHP 8)

Returns the difference between two DateTime objects

Description

Oop

DateTimeInterface::diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval
DateTimeImmutable::diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval
DateTime::diff(DateTimeInterface $targetObject, bool $absolute = false): DateInterval

Procedural

date_diff(DateTimeInterface $baseObject, DateTimeInterface $targetObject, bool $absolute = false): DateInterval

Returns the difference between two DateTimeInterface objects.

Parameters

datetime

The date to compare to.

absolute

Should the interval be forced to be positive?

Return Values

The DateInterval object represents the difference between the two dates.

The absolute parameter only affects the invert property of a DateInterval object.

The return value more specifically represents the clock-time interval to apply to the original object ($this or $originObject) to arrive at the $targetObject. This process is not always reversible.

The method is aware of DST changeovers, and hence can return an interval of 24 hours and 30 minutes, as per one of the examples. If you want to calculate with absolute time, you need to convert both the $this/$baseObject, and $targetObject to UTC first.

Examples

DateTimeImmutable::diff() example

Oop

php
<?php
$origin = new DateTimeImmutable('2009-10-11');
$target = new DateTimeImmutable('2009-10-13');
$interval = $origin->diff($target);
echo $interval->format('%R%a days');

The above example will output:

output
+2 days

Procedural

php
<?php
$origin = date_create('2009-10-11');
$target = date_create('2009-10-13');
$interval = date_diff($origin, $target);
echo $interval->format('%R%a days');

The above example will output:

output
+2 days

DateTimeInterface::diff during DST changeover

php
<?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 (Full days: %a)"), "\n";

The above example will output:

output
24:30:00 (Full days: 0)

DateTimeInterface::diff range

The value that the method returns is the exact amount of time to get from $this to $targetObject. Comparing January 1st to December 31st returns therefore 364, and not 365, days (for non-leap years).

php
<?php
$originalTime = new DateTimeImmutable("2023-01-01 UTC");
$targetTime = new DateTimeImmutable("2023-12-31 UTC");
$interval = $originalTime->diff($targetTime);
echo "Full days: ", $interval->format("%a"), "\n";

The above example will output:

output
Full days: 364

DateTime object comparison

Note

DateTimeImmutable and DateTime objects can be compared using comparison operators.

php
<?php
$date1 = new DateTime("now");
$date2 = new DateTime("tomorrow");

var_dump($date1 == $date2);
var_dump($date1 < $date2);
var_dump($date1 > $date2);

The above example will output:

output
bool(false)
bool(true)
bool(false)

See Also

Source: reference/datetime/datetimeinterface/diff.xml · from the official PHP manual (php/doc-en)