date_diff()
Узнайте, как PHP-функция date_diff() вычисляет разницу между датами, возвращает DateInterval и форматирует результат с помощью %a, %y и %R.
Функция date_diff() возвращает разницу между двумя объектами DateTime в виде объекта DateInterval. Она является процедурным псевдонимом метода DateTime::diff() и представляет собой стандартный способ ответить на вопросы вроде «сколько дней осталось до дедлайна?» или «сколько лет этому пользователю?» в PHP. В этом руководстве рассматривается синтаксис функции, возвращаемый ею объект DateInterval, заполнители format() для отображения результата, а также типичные подводные камни.
Синтаксис
date_diff(DateTime $baseObject, DateTime $targetObject, bool $absolute = false): DateInterval$baseObject— начальная дата (дата, от которой ведётся отсчёт).$targetObject— конечная дата (дата, до которой ведётся отсчёт).$absolute— еслиtrue, интервал всегда положительный и$interval->invertравен0. По умолчаниюfalse— знак сохраняется (отрицательный, если$targetObjectраньше$baseObject).
Функция возвращает объект DateInterval или false в случае ошибки.
Вычисление разницы между двумя датами
date_diff() принимает два объекта DateTime и возвращает объект DateInterval, описывающий разрыв между ними.
Вычисление разницы между датами в PHP
Этот код выведет +31 days. Мы создаём два объекта DateTime для 1 января и 1 февраля 2022 года, передаём их в date_diff(), а затем форматируем полученный DateInterval. Заполнитель %R выводит знак (+ или -), а %a — общее количество дней между датами.
date_diff($a, $b) полностью эквивалентно $a->diff($b) — используйте тот вариант, который лучше читается в вашем коде:
$interval = $first_date->diff($second_date);Чтение объекта DateInterval
Возвращаемый объект DateInterval разбивает разницу на отдельные календарные компоненты, каждый из которых доступен как публичное свойство:
| Свойство | Значение |
|---|---|
$interval->y | Годы |
$interval->m | Месяцы (0–11) |
$interval->d | Дни (0–30) |
$interval->h | Часы |
$interval->i | Минуты |
$interval->s | Секунды |
$interval->days | Общее количество дней за весь интервал |
$interval->invert | 1, если интервал отрицательный, иначе 0 |
<?php
$start = new DateTime('2020-03-15');
$end = new DateTime('2022-07-20');
$diff = $start->diff($end);
echo "{$diff->y} years, {$diff->m} months, {$diff->d} days";
echo " ({$diff->days} total days)";Этот код выведет 2 years, 4 months, 5 days (857 total days). Обратите внимание на разницу между $diff->d (компонент дней, 5) и $diff->days (общее количество дней, 857) — их путаница является наиболее распространённой ошибкой при работе с DateInterval.
Форматирование результата
DateInterval::format() преобразует интервал в строку с использованием заполнителей с префиксом %. Наиболее полезные из них:
| Заполнитель | Вывод |
|---|---|
%y / %m / %d | Годы / месяцы / дни (компонент) |
%a | Общее количество дней |
%h / %i / %s | Часы / минуты / секунды |
%R | Знак: - для отрицательного, + для положительного |
%r | Знак: - для отрицательного, пусто для положительного |
%% | Литеральный знак % |
<?php
$diff = (new DateTime('2022-01-01'))->diff(new DateTime('2023-04-10'));
echo $diff->format('%y years, %m months and %d days');Этот код выведет 1 years, 3 months and 9 days.
Знак и абсолютные разницы
По умолчанию интервал сохраняет свой знак, поэтому порядок аргументов имеет значение. Передайте true в качестве третьего аргумента, чтобы получить абсолютный (всегда положительный) результат:
<?php
$later = new DateTime('2022-02-01');
$earlier = new DateTime('2022-01-01');
// Target is earlier than base → negative interval
echo $later->diff($earlier)->format('%R%a days'), "\n"; // -31 days
// Force an absolute difference
echo date_diff($later, $earlier, true)->format('%R%a days'); // +31 daysПрактический пример: вычисление возраста
Распространённое применение на практике — вычисление возраста человека в полных годах по дате рождения:
<?php
$birthday = new DateTime('1995-06-21');
$today = new DateTime('2026-06-21');
$age = $birthday->diff($today)->y;
echo "Age: {$age} years";Этот код выведет Age: 31 years. Поскольку date_diff() понимает календарь, високосные годы и различная длина месяцев обрабатываются автоматически — вам не нужно самостоятельно делить секунды на 86400.
Заключение
date_diff() (и её идентичная методная форма DateTime::diff()) — это надёжный, учитывающий календарь способ измерить разрыв между двумя датами в PHP. Используйте разбитые компоненты (y, m, d) для вывода в удобочитаемом виде, days — для получения общего количества дней, и помните, что порядок аргументов определяет знак, если только вы не передаёте $absolute = true. Чтобы создать сравниваемые даты, см. date_create() и date_format(); для добавления или вычитания интервалов — date_add(), date_sub() и date_modify(). Подробнее о заполнителях, показанных выше, читайте в date_interval_format().
graph TD;
A[date_diff two DateTime objects] --> B[Returns a DateInterval];
B --> C[Read components: y, m, d, h, i, s];
B --> D[Read total days: days];
B --> E[Format with %y %m %d %a %R];Надеемся, это руководство оказалось полезным в вашей работе с PHP. Если у вас есть вопросы или комментарии, оставьте их ниже.