W3docs

Дата и время в 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— editable, runs on the server

Любой символ, не являющийся кодом форматирования, выводится буквально, поэтому можно свободно добавлять разделители и текст:

<?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 цифры0131
jДень месяца без ведущего нуля131
DСокращённое название дняMonSun
lПолное название дняMondaySunday
mМесяц, 2 цифры0112
nМесяц без ведущего нуля112
MСокращённое название месяцаJanDec
FПолное название месяцаJanuaryDecember
YГод, 4 цифры2025
yГод, 2 цифры25
HЧас в 24-часовом формате, 2 цифры0023
hЧас в 12-часовом формате, 2 цифры0112
iМинуты, 2 цифры0059
sСекунды, 2 цифры0059
AAM / PMAM, PM
UUnix-метка времени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() преобразует её в метку времени, с которой можно выполнять форматирование и арифметику. Она понимает как абсолютные даты, так и относительные фразы на английском языке:

php— editable, runs on the server

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.

Практика

Практика
Какие из следующих функций PHP можно использовать для получения текущих даты и времени?
Какие из следующих функций PHP можно использовать для получения текущих даты и времени?
Was this page helpful?