Дата и время в PHP
Работа с датами в PHP: форматирование через date(), установка часового пояса, разбор строк через strtotime() и арифметика дат с DateTime.
Практически каждое веб-приложение работает с датами и временем: временны́е метки публикаций, даты истечения срока действия, подписи «3 дня назад», планирование задач, ведение журналов. PHP предоставляет два взаимодополняющих инструмента — процедурное семейство функций date() для быстрого форматирования и объектно-ориентированный класс DateTime для более безопасной и мощной арифметики дат.
В этой главе показано, как отображать текущую дату, управлять часовым поясом, преобразовывать строки в временны́е метки и вычислять разницу между двумя датами — включая типичные подводные камни.
Как PHP представляет время
Внутри PHP хранит момент времени в виде Unix-метки времени (Unix timestamp): количества секунд, прошедших с полуночи UTC 1 января 1970 года. Функция time() возвращает текущую метку, и большинство функций для работы с датами принимают её в качестве аргумента:
<?php
echo time(); // e.g. 1750464000 (an integer)
echo date("Y-m-d"); // turns "now" into a readable string
?>Метка времени не зависит от часового пояса — она обозначает один и тот же момент в любой точке Земли. Часовой пояс важен только при форматировании этого момента в удобочитаемую строку, поэтому правильная настройка часового пояса имеет принципиальное значение (см. ниже).
Базовое использование date()
Функция date() преобразует метку времени в форматированную строку:
date(string $format, ?int $timestamp = null): string$format— строка символов форматирования, определяющая вид вывода.$timestamp— необязательный аргумент. Если его не передать,date()использует текущее время.
Текущая дата в формате дд/мм/гггг:
Любой символ, не являющийся кодом форматирования, выводится буквально, поэтому можно свободно добавлять разделители и текст:
<?php
echo date("l, F j, Y"); // e.g. Saturday, June 21, 2025
echo "\n";
echo date("Y-m-d H:i:s"); // e.g. 2025-06-21 14:30:05
?>Коды форматирования
date() поддерживает десятки символов форматирования. Наиболее часто используемые:
| Код | Значение | Пример |
|---|---|---|
d | День месяца, 2 цифры | 01 – 31 |
j | День месяца без ведущего нуля | 1 – 31 |
D | Сокращённое название дня | Mon – Sun |
l | Полное название дня | Monday – Sunday |
m | Месяц, 2 цифры | 01 – 12 |
n | Месяц без ведущего нуля | 1 – 12 |
M | Сокращённое название месяца | Jan – Dec |
F | Полное название месяца | January – December |
Y | Год, 4 цифры | 2025 |
y | Год, 2 цифры | 25 |
H | Час в 24-часовом формате, 2 цифры | 00 – 23 |
h | Час в 12-часовом формате, 2 цифры | 01 – 12 |
i | Минуты, 2 цифры | 00 – 59 |
s | Секунды, 2 цифры | 00 – 59 |
A | AM / PM | AM, PM |
U | Unix-метка времени | 1750464000 |
Чтобы вывести букву, совпадающую с кодом форматирования (например, буквальную H), экранируйте её обратной косой чертой: date('\H:i').
Установка часового пояса
date() форматирует время в соответствии с часовым поясом сервера по умолчанию. Использование часового пояса по умолчанию — распространённая причина ошибок «время смещено на несколько часов». Устанавливайте часовой пояс явно в начале скрипта (или в php.ini):
<?php
date_default_timezone_set("America/New_York");
echo date("Y-m-d H:i:s"); // formatted for New York time
?>Используйте названия часовых поясов IANA, например Europe/London, Asia/Tokyo или UTC. Обзор того, как PHP работает с регионами и переходом на летнее время, приведён в главе PHP Timezones.
Разбор строк в метки времени
Когда дата приходит в виде текста — из формы, API или базы данных — функция strtotime() преобразует её в метку времени, с которой можно выполнять форматирование и арифметику. Она понимает как абсолютные даты, так и относительные фразы на английском языке:
strtotime() гибка, но допускает неоднозначность. Строка вида 01/02/2022 трактуется как месяц/день (американский формат). Для предсказуемого разбора строки с известным форматом предпочтительнее использовать DateTime::createFromFormat() (см. ниже). Если strtotime() не может распознать входные данные, она возвращает false, поэтому всегда проверяйте результат. Полный список поддерживаемых фраз приведён в отдельной главе strtotime().
Класс DateTime
Для всего, что выходит за рамки простого отображения, объектно-ориентированный API DateTime является современным рекомендуемым подходом. Он не имеет ограничений целочисленного переполнения, аккуратно работает с часовыми поясами и делает арифметику дат читаемой:
<?php
$date = new DateTime("2022-01-01 12:00:00");
// Format it
echo $date->format("l, F j, Y"); // Saturday, January 1, 2022
echo "\n";
// Add or subtract durations with DateInterval
$date->modify("+10 days");
echo $date->format("Y-m-d"); // 2022-01-11
?>DateTimeImmutable работает аналогично, но никогда не изменяет исходный объект — modify() возвращает новый экземпляр. Используйте его при передаче дат между функциями, чтобы вызванный метод не мог незаметно изменить ваше значение.
Вычисление разницы между двумя датами
DateTime::diff() возвращает объект DateInterval, описывающий промежуток между двумя датами, что значительно безопаснее, чем вычитание меток времени:
<?php
$start = new DateTime("2022-01-01");
$end = new DateTime("2022-03-15");
$diff = $start->diff($end);
echo $diff->days . " days total\n"; // 73 days total
echo $diff->format("%m months, %d days"); // 2 months, 14 days
?>Функциональный эквивалент описан в главе date_diff().
Типичные ошибки
- Проблема 2038 года. На 32-битных системах
date()иstrtotime()работают со знаковыми 32-битными целыми и перестают корректно работать после2038-01-19 03:14:07 UTC. КлассDateTimeэтой проблемы лишён, поэтому используйте его для дат в далёком прошлом или будущем. date()— неDate(). Имена функций PHP нечувствительны к регистру, однако коды форматирования чувствительны:m(месяц) иM(название месяца) — разные коды.- Предупреждение об отсутствии часового пояса. Без настроенного часового пояса старые версии PHP выдают предупреждение. Вызывайте
date_default_timezone_set()в начале скрипта. strtotime()возвращаетfalse, а не0, при ошибке — при этом0является допустимой меткой времени (Unix-эпоха), поэтому проверяйте результат через=== false.
Заключение
PHP предлагает широкий набор инструментов для работы с датами и временем. Используйте date() и time() для быстрого форматирования, strtotime() — для разбора входящих строк, а классы DateTime / DateTimeImmutable — для часовой-поясной арифметики и сравнения дат. Устанавливайте часовой пояс явно, проверяйте разобранные данные и предпочитайте DateTime везде, где нужно складывать, вычитать или сравнивать даты.
Далее подробно рассмотрите составные части: функция date() в PHP, strtotime() и PHP Timezones.