W3docs

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

php— editable, runs on the server

Этот код выведет +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->invert1, если интервал отрицательный, иначе 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. Если у вас есть вопросы или комментарии, оставьте их ниже.

Практика

Практика
Что делает функция PHP date_diff()?
Что делает функция PHP date_diff()?
Was this page helpful?