КаталогBuilderPHPDocs

Глава 15. Работа с датой и временем в PHP

Дата и время встречаются почти в любом проекте: публикация новостей, срок действия подписки, расписание задач, история платежей, логи, бронирование, уведомления и отчёты. При этом работа со временем часто кажется простой только до первого часового пояса, перехода на летнее время или сравнения дат.

Современное примечание. Старые примеры часто используют time() и date(). Они всё ещё полезны, но для сложной логики лучше применять DateTime, DateTimeImmutable и явное указание часового пояса.

Функция date()

date() форматирует Unix timestamp. Это удобно для простого вывода текущей даты.

echo date('Y-m-d H:i:s');

Но если приложение работает с разными часовыми поясами, лучше не полагаться на настройки сервера по умолчанию.

Часовой пояс

Часовой пояс можно задать глобально, но в больших проектах лучше хранить его явно в настройках пользователя или проекта.

date_default_timezone_set('Europe/Moscow');

echo date('d.m.Y H:i');

DateTime

DateTime удобен для создания, изменения и сравнения дат. Объект можно создать из строки, а затем отформатировать.

$date = new DateTime('2026-07-07 12:00:00');
echo $date->format('d.m.Y H:i');

DateTimeImmutable

DateTime изменяет сам объект. DateTimeImmutable возвращает новый объект при изменении. Это безопаснее в коде, где одна дата используется в нескольких местах.

$start = new DateTimeImmutable('2026-07-01');
$end = $start->modify('+7 days');

echo $start->format('Y-m-d'); // 2026-07-01
echo $end->format('Y-m-d');   // 2026-07-08

Сравнение дат

Объекты даты можно сравнивать напрямую. Это удобно для проверки срока действия подписки или дедлайна.

$expiresAt = new DateTimeImmutable('2026-08-01');
$now = new DateTimeImmutable();

if ($expiresAt > $now) {
    echo 'Подписка активна';
}

Интервалы

Разницу между датами можно получить через diff(). Метод возвращает объект DateInterval.

$created = new DateTimeImmutable('2026-07-01');
$now = new DateTimeImmutable('2026-07-07');

$diff = $created->diff($now);
echo $diff->days; // 6

Хранение даты в базе

Для MySQL обычно используют DATETIME или TIMESTAMP. Практичный подход — хранить дату в UTC, а пользователю показывать её в нужном часовом поясе. Для простых сайтов можно хранить локальное время проекта, но это решение нужно принять осознанно.

Типичные ошибки

  • Сравнивать даты как строки в произвольном формате.
  • Не учитывать часовой пояс сервера.
  • Хранить дату в формате 07.07.2026 вместо нормального Y-m-d H:i:s.
  • Использовать strtotime() для сложной бизнес-логики без проверок.
  • Путать время создания записи и время последнего изменения.

Итоги

Для простого вывода достаточно date(), но для серьёзной разработки лучше использовать DateTimeImmutable, явно задавать часовой пояс и хранить даты в базе в предсказуемом формате. Работа со временем требует аккуратности, потому что небольшая ошибка может нарушить оплату, расписание или отчёты.