Формат даты в PHP это строка, где буквы обозначают части даты: date('Y-m-d H:i:s') выводит что-то вроде 2026-03-14 09:05:07. Y это год из 4 цифр, m месяц, d день, H час (24-часовой формат), i минуты, а s секунды; любой символ, который не является буквой формата, например -, / или :, выводится как есть. Одни и те же строки формата работают в date() и в DateTimeImmutable::format().
Измените $format и нажмите Run. Дата зафиксирована на субботе, 14 марта 2026 года, 09:05:07, поэтому видно, что именно делает каждая буква:
Вывод:
Sat, 14 Mar 2026 09:05
2026-03-14
14/03/2026
Saturday, March 14th, 2026
9:05 AM
date($format) форматирует текущий момент, а date($format, $timestamp) метку времени; $date->format($format) форматирует объект даты. Всё остальное о датах, от strtotime() до часовых поясов, на странице PHP date().
Символы формата даты
Каждый пример ниже это результат для 2026-03-14 09:05:07.123456 UTC.
День
| Символ | Значение | Пример |
|---|---|---|
d | День месяца, 2 цифры с ведущим нулём (от 01 до 31) | 14 |
j | День месяца без ведущего нуля (от 1 до 31) | 14 |
D | Краткое название дня, 3 буквы | Sat |
l (строчная L) | Полное название дня | Saturday |
N | День недели по ISO, от 1 (понедельник) до 7 (воскресенье) | 6 |
w | День недели, от 0 (воскресенье) до 6 (суббота) | 6 |
S | Английский суффикс дня: st, nd, rd или th. Используйте после j | th |
z | День года, начиная с 0 | 72 |
Неделя и месяц
| Символ | Значение | Пример |
|---|---|---|
W | Номер недели по ISO 8601 (недели начинаются с понедельника) | 11 |
F | Полное название месяца | March |
M | Краткое название месяца, 3 буквы | Mar |
m | Номер месяца с ведущим нулём (от 01 до 12) | 03 |
n | Номер месяца без ведущего нуля (от 1 до 12) | 3 |
t | Число дней в месяце | 31 |
Год
| Символ | Значение | Пример |
|---|---|---|
Y | Полный год, не меньше 4 цифр | 2026 |
y | Год, 2 цифры | 26 |
L | 1, если год високосный, иначе 0 | 0 |
o | Год нумерации недель по ISO 8601 (используйте с W) | 2026 |
X | Расширенный полный год со знаком (PHP 8.2+) | +2026 |
x | Расширенный полный год, знак только при необходимости (PHP 8.2+) | 2026 |
Время
| Символ | Значение | Пример |
|---|---|---|
H | Час, 24-часовой формат, с ведущим нулём (от 00 до 23) | 09 |
G | Час, 24-часовой формат, без ведущего нуля (от 0 до 23) | 9 |
h | Час, 12-часовой формат, с ведущим нулём (от 01 до 12) | 09 |
g | Час, 12-часовой формат, без ведущего нуля (от 1 до 12) | 9 |
i | Минуты с ведущим нулём (от 00 до 59) | 05 |
s | Секунды с ведущим нулём (от 00 до 59) | 07 |
a | am или pm | am |
A | AM или PM | AM |
v | Миллисекунды | 123 |
u | Микросекунды (в date() всегда 000000, она принимает целые секунды) | 123456 |
B | Интернет-время Swatch (от 000 до 999) | 420 |
Часовой пояс
| Символ | Значение | Пример |
|---|---|---|
e | Идентификатор часового пояса | UTC |
T | Аббревиатура часового пояса | UTC |
P | Смещение от UTC с двоеточием | +00:00 |
p | Как P, но Z для UTC | Z |
O | Смещение от UTC без двоеточия | +0000 |
Z | Смещение в секундах | 0 |
I (заглавная i) | 1 во время летнего времени, иначе 0 | 0 |
Полные дата и время
| Символ | Значение | Пример |
|---|---|---|
c | Дата и время в ISO 8601 | 2026-03-14T09:05:07+00:00 |
r | Дата в RFC 2822, используется в заголовках email | Sat, 14 Mar 2026 09:05:07 +0000 |
U | Метка времени Unix (секунды с 1970-01-01 UTC) | 1773479107 |
Та же таблица вживую: этот блок выводит каждый символ для выбранной вами даты. Подставьте свой день рождения, дату во второй половине дня или дату в конце високосного года:
Буквы и слова внутри формата
Любая буква в строке формата читается как символ формата, поэтому 'Today is l' не выведет "Today is": T, o, d, a, y, i и s все символы формата. Ставьте обратный слеш перед каждой буквой, которую нужно вывести как есть. В строке в двойных кавычках \t уже означает символ табуляции, поэтому для форматов с обратными слешами используйте одинарные кавычки:
Вывод:
UTC202614am26 0507 Saturday
Today is Saturday
Saturday the 14th of March
2026-03-14T09:05:07
Saturday 09UTC 14th
Распространённые форматы даты
Большей части кода нужно лишь несколько форматов. Этот блок выводит их HTML-таблицей, поэтому она появляется во вкладке Page:
Храните и сравнивайте даты в формате Y-m-d или Y-m-d H:i:s: строки в таком порядке сортируются так же, как сами даты, а строки d/m/Y нет.
ISO 8601, DATE_ATOM и другие стандартные форматы
В PHP есть константы для форматов, которых ждут API, ленты и cookie. DATE_ATOM (также DateTimeInterface::ATOM) это ISO 8601 и RFC 3339, формат, который используют JSON API:
Вывод:
2026-03-14T09:05:07+00:00
2026-03-14T09:05:07+00:00
2026-03-14T09:05:07.000+00:00
Sat, 14 Mar 2026 09:05:07 +0000
Sat, 14 Mar 2026 09:05:07 +0000
Saturday, 14-Mar-2026 09:05:07 UTC
Y-m-d\TH:i:sP
Есть и константа DATE_ISO8601, но в её смещении нет двоеточия (+0000), а ISO 8601 в такой форме этого не допускает; используйте DATE_ATOM.
Японский формат даты (Y年m月d日)
Символы, которые не являются буквами формата, выводятся как есть, и это касается и иероглифов, поэтому 'Y年n月j日' работает так, как написано. n и j убирают ведущий ноль (3月14日), m и d его сохраняют (03月14日). Название дня это единственная часть, которую date() не может перевести, потому что знает только английские названия; вместо этого сопоставьте число w со своим списком:
Вывод:
2026年3月14日
2026年03月14日 09時05分
2026年3月14日(土)
2026/03/14
Для полной локализации, включая названия месяцев на других языках и японскую эру (令和), IntlDateFormatter из расширения intl форматирует по шаблонам локали. Он использует буквы шаблонов ICU (yyyy, MM, EEEE), а не символы PHP с этой страницы:
<?php
$formatter = new IntlDateFormatter('ja_JP', IntlDateFormatter::FULL, IntlDateFormatter::NONE, 'Asia/Tokyo');
echo $formatter->format(new DateTimeImmutable('2026-03-14')); // 2026年3月14日土曜日
$era = new IntlDateFormatter('ja_JP@calendar=japanese', IntlDateFormatter::LONG, IntlDateFormatter::NONE, 'Asia/Tokyo', IntlDateFormatter::TRADITIONAL);
echo $era->format(new DateTimeImmutable('2026-03-14')); // 令和8年3月14日
Преобразование даты из одного формата в другой
Чтобы превратить 14/03/2026 в 2026-03-14, разберите строку по формату, в котором она записана, через DateTimeImmutable::createFromFormat(), а потом отформатируйте снова. Функция использует те же символы, что и таблица. Начинайте формат с !, иначе поля, которых вы не указали (здесь время), заполнятся из текущего момента:
Вывод:
2026-03-14 00:00:00
March 14, 2026
bool(false)
2026-03-03
Array
(
[10] => The parsed date was invalid
)
Для дат, которые вводят пользователи, считайте любое предупреждение из getLastErrors() неверной датой, так же как false.
Частые ошибки с форматами даты
Три ошибки встречаются снова и снова: m там, где имелось в виду i, Y вместо y и то, что strtotime() сама угадывает порядок дня и месяца. strtotime() читает даты через слеш в американском порядке месяц/день, а через дефис или точку в порядке день-месяц, поэтому одни и те же цифры дают две разные даты:
Вывод:
09:03:07
09:05:07
14/03/26
2026-03-04
2026-04-03
bool(false)
Когда формат входных данных известен, укажите его через createFromFormat(), а не позволяйте strtotime() угадывать.
Часто задаваемые вопросы
Что означает date('Y-m-d') в PHP?
Каждая буква заменяется частью даты: Y это год из 4 цифр, m месяц с ведущим нулём, d день с ведущим нулём, а дефисы выводятся как есть. 14 марта 2026 года функция вернёт 2026-03-14.
Как преобразовать дату из одного формата в другой в PHP?
Разберите её по формату, в котором она записана, а потом отформатируйте нужным: DateTimeImmutable::createFromFormat('!d/m/Y', '14/03/2026')->format('Y-m-d') возвращает 2026-03-14. createFromFormat() возвращает false, когда строка не совпадает с форматом, поэтому сначала проверьте это.
Чем m отличается от i в формате даты PHP?
m это месяц (от 01 до 12), а i минуты (от 00 до 59). Запись 'H:m' вместо 'H:i' это частая ошибка: во времени на месте минут оказывается номер месяца.
Как отформатировать дату в ISO 8601 в PHP?
Используйте символ c или константу DATE_ATOM: $date->format(DATE_ATOM) возвращает 2026-03-14T09:05:07+00:00. Избегайте DATE_ISO8601: в её смещении нет двоеточия (+0000), и это не корректный ISO 8601.
Как вывести день недели по-японски через PHP date()?
date() выводит только английские названия, поэтому сопоставьте число w (0 для воскресенья, 6 для субботы) со своим списком: ['日','月','火','水','木','金','土'][$date->format('w')]. С расширением intl IntlDateFormatter форматирует даты целиком в любой локали.