Menu

PHP date(): получить, отформатировать и вычислить дату

date('Y-m-d') возвращает сегодняшнюю дату строкой, а date('Y-m-d', $timestamp) форматирует любую метку времени Unix. time(), mktime(), strtotime(), DateTimeImmutable, прибавление дней, разница между двумя датами и часовые пояса на примерах, которые можно запустить.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

date('Y-m-d') возвращает сегодняшнюю дату строкой, например 2026-03-14. Первый аргумент это строка формата, где каждая буква обозначает часть даты (Y год, m месяц, d день, H:i:s время), а необязательный второй аргумент это метка времени Unix, которую нужно отформатировать вместо текущего момента.

Вывод меняется при каждом нажатии Run, потому что это текущие дата и время в UTC. Все буквы строки формата и то, как вставлять между ними обычный текст, описаны на странице о формате даты в PHP.

Метки времени: time(), mktime() и strtotime()

Метка времени Unix это число секунд с 1 января 1970 года, полночь UTC. time() возвращает текущую, mktime(hour, minute, second, month, day, year) собирает её из частей, а strtotime() читает дату, записанную по-английски ('2026-03-14', '+1 week', 'next monday'). Любую метку времени можно передать вторым аргументом date(). Второй аргумент strtotime() это момент, от которого отсчитывается относительная фраза; без него отсчёт идёт от текущего момента.

Вывод:

1773480600
Sat, 14 Mar 2026 09:30
2027-01-01

tomorrow                    Sun 2026-03-15
+1 week                     Sat 2026-03-21
next monday                 Mon 2026-03-16
last day of this month      Tue 2026-03-31
first monday of next month  Mon 2026-04-06
bool(false)

Перенос в mktime() полезен: день 0 месяца это последний день предыдущего месяца, поэтому mktime(0, 0, 0, 3, 0, 2026) это 28 февраля. Всегда сравнивайте результат с false, прежде чем передавать его дальше: date('Y-m-d', false) молча выводит 1970-01-01, дату, которую никто не имел в виду.

Прибавление дней к дате

Для всего, что сложнее вывода, используйте DateTimeImmutable. Его метод modify() принимает те же фразы, что и strtotime(), и возвращает новую дату, а add() принимает DateInterval, например P7D (период в 7 дней) или PT90M (90 минут).

Вывод:

2026-03-21
2026-03-13
2026-04-14
11:00
2025-03-14
2026-03-03
2026-02-28

31 февраля не существует, поэтому +1 month от 31 января попадает на 3 марта. Когда вы имеете в виду "конец следующего месяца", так и пишите: last day of next month.

DateTime и DateTimeImmutable

DateTime меняет сам себя, когда вы вызываете modify(), add() или setDate(), и возвращает тот же объект. Это удивляет тех, кто хранит исходную дату в переменной:

Вывод:

2026-03-21
2026-03-21
bool(true)
2026-03-14
2026-03-21

В новом коде предпочитайте DateTimeImmutable. У обоих классов одинаковые методы, и оба реализуют DateTimeInterface, поэтому функция может принимать любой из них.

Разница между двумя датами

diff() возвращает DateInterval. Его свойство days это общее число дней между двумя датами, а y, m и d раскладывают разрыв на годы, месяцы и дни, ровно то, что нужно для вычисления возраста. Измените даты и запустите снова:

Вывод:

Age: 35
Exactly: 35 years, 7 months, 22 days
Days alive: 13021
286 days to go
9 months and 11 days
-286 days

В format() %a это общее число дней, а %d только дневная часть, поэтому для "сколько дней осталось" нужен %a. Чтобы сравнить две даты без вычисления разницы, с объектами дат работают обычные операторы: $today < $christmas даёт true.

Часовые пояса

date() и new DateTimeImmutable() используют часовой пояс по умолчанию, который берётся из date.timezone в php.ini (UTC, если он не задан). Задайте его для всего скрипта через date_default_timezone_set() или дайте отдельной дате собственный DateTimeZone и преобразуйте через setTimezone():

Вывод:

Asia/Tokyo        2026-03-14 18:30 JST +09:00
Europe/Berlin     2026-03-14 10:30 CET +01:00
America/New_York  2026-03-14 05:30 EDT -04:00
Asia/Tokyo
2026-03-14 18:30

Метка времени везде одно и то же число; часовой пояс меняет только то, как она записана. Поэтому обычно советуют хранить даты в UTC и преобразовывать их при выводе.

Календарь на веб-странице

Чаще всего даты выводят в HTML. Этот блок рисует календарь текущего месяца и выделяет сегодняшний день. Запустите его, затем нажмите Previous или Next: тот же скрипт выполнится снова с $_GET['m'] из ссылки, например ?m=2026-04.

format('N') даёт день недели от 1 (понедельник) до 7 (воскресенье), и столько пустых ячеек ставится перед 1-м числом, а format('t') даёт число дней в месяце. ! в '!Y-m' сбрасывает все поля, которые формат не упоминает, поэтому день будет 1-м, а время полночью.

Частые ошибки с date()

Второй аргумент date() должен быть меткой времени, а не строкой с датой. Эта строка:

<?php
echo date('d/m/Y', '2026-03-14');

останавливает скрипт с TypeError:

PHP Fatal error:  Uncaught TypeError: date(): Argument #2 ($timestamp) must be of type ?int, string given in /home/index.php:2

Сначала преобразуйте строку через strtotime() или объект:

Вывод:

14/03/2026
14/03/2026
bool(false)
bool(true)

Ещё две ловушки: m это месяц, а i минуты, поэтому 'H:m' выводит месяц там, где вы хотели минуты; а new DateTimeImmutable('garbage') выбрасывает исключение, а не возвращает false, поэтому оборачивайте пользовательский ввод в try/catch или разбирайте его через DateTimeImmutable::createFromFormat(), которая при несовпадении возвращает false.

Часто задаваемые вопросы

Как получить текущую дату в PHP?

Вызовите date() со строкой формата: echo date('Y-m-d'); выводит сегодняшнюю дату вроде 2026-03-14, а date('Y-m-d H:i:s') добавляет время. Объектный вариант: (new DateTimeImmutable())->format('Y-m-d').

Как прибавить дни к дате в PHP?

Используйте modify() у DateTimeImmutable: (new DateTimeImmutable('2026-03-14'))->modify('+7 days')->format('Y-m-d') даёт 2026-03-21. С метками времени то же самое делает date('Y-m-d', strtotime('+7 days', $timestamp)).

Как вычислить разницу между двумя датами в PHP?

Вызовите diff() у одной даты с другой: $a->diff($b) возвращает DateInterval. Его свойство days это общее число дней, а y, m, d хранят годы, месяцы и дни, и так вычисляют возраст.

Как преобразовать метку времени Unix в дату в PHP?

Передайте её вторым аргументом date(): date('Y-m-d H:i:s', 1773479107) возвращает 2026-03-14 09:05:07 в UTC. Для объекта используйте new DateTimeImmutable('@1773479107').

Почему PHP date() показывает неправильное время?

date() использует часовой пояс по умолчанию, который берётся из date.timezone в php.ini и часто равен UTC. Задайте свой через date_default_timezone_set('Europe/Berlin') в начале скрипта или передайте DateTimeZone в DateTimeImmutable.

Иллюстрация языков программирования Coddy

Учитесь программировать с Coddy

НАЧАТЬ