Как вывести дату в PHP: date и DateTime
Сначала задайте часовой пояс, потом выводите дату:
<?php
date_default_timezone_set('Europe/Minsk');
echo date('d.m.Y H:i');Выведет текущие дату и время вида 05.11.2026 14:30. Без часового пояса PHP считает время по UTC (всемирное время), и часы разойдутся с минскими на 3. Пояс лучше задать один раз для всего сервера строкой date.timezone = Europe/Minsk в php.ini, а в коде вызывать date_default_timezone_set, только если доступа к php.ini нет.
Буквы формата
| Буква | Что значит | Пример |
|---|---|---|
d | день с нулём | 05 |
j | день без нуля | 5 |
m | месяц с нулём | 03 |
n | месяц без нуля | 3 |
Y | год, 4 цифры | 2025 |
y | год, 2 цифры | 25 |
H | часы 00–23 | 09 |
i | минуты | 07 |
s | секунды | 45 |
N | день недели: 1 — понедельник … 7 — воскресенье | 6 |
t | дней в месяце | 31 |
Остальные знаки выводятся как есть: date('Y-m-d H:i:s') — формат для базы данных, date('d.m.Y') — привычный в Беларуси. Буква, которую нужно вывести буквально, экранируется обратной чертой.
DateTimeImmutable
Для расчётов удобнее объекты дат:
<?php
$start = new DateTimeImmutable('2025-01-01');
$end = new DateTimeImmutable('2025-03-08');
echo $end->format('d.m.Y') . "\n";
echo $start->modify('+1 month')->format('d.m.Y') . "\n";
echo $start->diff($end)->days . "\n";
echo $end->format('N') . "\n";08.03.2025
01.02.2025
66
6new DateTimeImmutable('2025-03-08')создаёт дату из строки; без аргумента — текущий момент.format— те же буквы, что уdate.modify('+1 month')возвращает новую дату, а исходная не меняется — в этом смысл Immutable. Подходят выражения+1 day,-2 weeks,next monday,last day of this month.diffвозвращает разницу,->days— полное число дней между датами.
У похожего класса DateTime метод modify меняет сам объект — из-за этого легко испортить дату, которая нужна дальше. Новичкам проще с DateTimeImmutable.
Месяц по-русски
date и format пишут названия месяцев и дней только по-английски (F — March, l — Saturday). Русские названия проще всего взять из своего массива:
<?php
$months = [1 => 'января', 'февраля', 'марта', 'апреля', 'мая', 'июня',
'июля', 'августа', 'сентября', 'октября', 'ноября', 'декабря'];
$date = new DateTimeImmutable('2025-03-08');
echo $date->format('j') . ' ' . $months[(int) $date->format('n')] . ' ' . $date->format('Y') . "\n";8 марта 2025Запись [1 => 'января', 'февраля', …] начинает нумерацию с единицы: дальше ключи идут 2, 3, 4 и так далее.
Метка времени
time() возвращает текущее время числом — секунды с 1 января 1970 года (UTC). Такое число удобно хранить и сравнивать. strtotime переводит строку в такое число, date — обратно:
<?php
echo date('d.m.Y', strtotime('2025-03-08 +10 days')) . "\n";18.03.2025Подводные камни
- Конец месяца.
+1 monthот 31 января даёт 3 марта, а в високосный год — 2 марта (31 февраля «переливается» в март). Для последнего дня следующего месяца пишитеlast day of next month. - Дата от посетителя. Проверяйте её перед использованием:
checkdate(2, 30, 2025)вернётfalse— такого дня нет. Для строки известного формата естьDateTimeImmutable::createFromFormat('d.m.Y', $input), который вернётfalse, если строка не подошла. - Хранение в базе. Сохраняйте дату в формате
Y-m-d H:i:sили в столбце типа даты — такие значения правильно сортируются. Строки вида08.03.2025сортируются как текст, и порядок получается неверным.