Глава 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, явно задавать часовой пояс и хранить даты в базе в предсказуемом формате. Работа со временем требует аккуратности, потому что небольшая ошибка может нарушить оплату, расписание или отчёты.