How to Calculate Date Difference in PHP Using DateInterval
Calculating the time span between two dates is a common task in web
development. This article provides a straightforward guide on how to use
PHP’s built-in DateTime and DateInterval
classes to calculate the difference between two dates. You will learn
how to instantiate date objects, compare them, and format the resulting
difference into years, months, days, and more.
The Basic Method: Using DateTime::diff
To calculate the difference between two dates in PHP, you first need
to represent them as DateTime objects. You then use the
diff() method on one of the objects, passing the other
object as an argument. The diff() method compares the two
dates and returns a DateInterval object containing the
difference.
Here is a simple example:
<?php
// Define two date strings
$startDateString = '2023-01-15';
$endDateString = '2024-03-22';
// Create DateTime objects
$startDate = new DateTime($startDateString);
$endDate = new DateTime($endDateString);
// Calculate the difference
$interval = $startDate->diff($endDate);
// Output the DateInterval details
echo "Difference: " . $interval->y . " years, " . $interval->m . " months, and " . $interval->d . " days.";
?>Accessing DateInterval Properties
The returned DateInterval object contains several
properties that you can access directly to get specific units of
time:
y: Yearsm: Monthsd: Daysh: Hoursi: Minutess: Secondsdays: The total number of days between the two dates (unliked, which only represents the day portion of the remainder).invert: Set to1if the interval represents a negative time span (i.e., the second date is in the past compared to the first date), otherwise0.
Formatting the Output
You can also use the format() method of the
DateInterval class to display the difference in a
customized string format. The format characters must be prefixed with a
percent sign (%).
<?php
$startDate = new DateTime('2023-05-01 12:00:00');
$endDate = new DateTime('2023-05-03 14:30:00');
$interval = $startDate->diff($endDate);
// Format output: 2 days, 2 hours, and 30 minutes
echo $interval->format('%d days, %h hours, and %i minutes');
?>Common formatting characters include: * %Y: Years (2
digits with leading zero) * %m: Months (2 digits with
leading zero) * %d: Days (2 digits with leading zero) *
%a: Total number of days * %H: Hours (2 digits
with leading zero) * %I: Minutes (2 digits with leading
zero) * %S: Seconds (2 digits with leading zero) *
%R: Sign (“+” or “-”)
Handling Past and Future Dates
By default, the diff() method calculates the absolute
difference. If you need to know if the target date is in the past or the
future relative to the starting date, you can check the
invert property:
<?php
$today = new DateTime('today');
$targetDate = new DateTime('2023-12-25');
$interval = $today->diff($targetDate);
if ($interval->invert === 1) {
echo "The target date was " . $interval->days . " days ago.";
} else {
echo "The target date is in " . $interval->days . " days.";
}
?>