Menu

Формат даты в PHP: все символы формата date()

Формат даты в PHP это строка из букв вроде 'Y-m-d H:i:s', где Y это год из 4 цифр, m месяц, d день, H час, i минуты, а s секунды. Здесь все символы формата с примерами, а также экранирование, ISO 8601, японские даты и преобразование одного формата в другой.

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

Формат даты в 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. Используйте после jth
zДень года, начиная с 072

Неделя и месяц

СимволЗначениеПример
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
L1, если год високосный, иначе 00
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
aam или pmam
AAM или PMAM
vМиллисекунды123
uМикросекунды (в date() всегда 000000, она принимает целые секунды)123456
BИнтернет-время Swatch (от 000 до 999)420

Часовой пояс

СимволЗначениеПример
eИдентификатор часового поясаUTC
TАббревиатура часового поясаUTC
PСмещение от UTC с двоеточием+00:00
pКак P, но Z для UTCZ
OСмещение от UTC без двоеточия+0000
ZСмещение в секундах0
I (заглавная i)1 во время летнего времени, иначе 00

Полные дата и время

СимволЗначениеПример
cДата и время в ISO 86012026-03-14T09:05:07+00:00
rДата в RFC 2822, используется в заголовках emailSat, 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 форматирует даты целиком в любой локали.

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

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

НАЧАТЬ