Menu

Format daty w PHP: wszystkie znaki formatu date()

Format daty w PHP to string liter takich jak 'Y-m-d H:i:s', gdzie Y to rok czterocyfrowy, m miesiąc, d dzień, H godzina, i minuty, a s sekundy. Tutaj znajdziesz każdy znak formatu z przykładem, a także escapowanie, ISO 8601, japońskie daty i konwersję z jednego formatu na inny.

Na tej stronie są działające edytory: edytuj, uruchamiaj i od razu zobacz wynik.

Format daty w PHP to string, w którym litery oznaczają części daty: date('Y-m-d H:i:s') wypisuje coś w rodzaju 2026-03-14 09:05:07. Y to rok czterocyfrowy, m miesiąc, d dzień, H godzina (zegar 24-godzinny), i minuty, a s sekundy; każdy znak, który nie jest literą formatu, taki jak -, / czy :, jest wypisywany bez zmian. Te same stringi formatu działają w date() i w DateTimeImmutable::format().

Zmień $format i naciśnij Run. Data jest ustalona na sobotę 14 marca 2026, 09:05:07, więc widać dokładnie, co robi każda litera:

Wynik:

Sat, 14 Mar 2026 09:05
2026-03-14
14/03/2026
Saturday, March 14th, 2026
9:05 AM

date($format) formatuje bieżącą chwilę, a date($format, $timestamp) znacznik czasu; $date->format($format) formatuje obiekt daty. Wszystko inne o datach, od strtotime() po strefy czasowe, opisuje strona date() w PHP.

Znaki formatu daty

Każdy przykład poniżej to wynik dla 2026-03-14 09:05:07.123456 UTC.

Dzień

ZnakZnaczeniePrzykład
dDzień miesiąca, 2 cyfry z zerem wiodącym (01 do 31)14
jDzień miesiąca bez zera wiodącego (1 do 31)14
DKrótka nazwa dnia, 3 literySat
l (małe L)Pełna nazwa dniaSaturday
NDzień tygodnia ISO, 1 (poniedziałek) do 7 (niedziela)6
wDzień tygodnia, 0 (niedziela) do 6 (sobota)6
SAngielski przyrostek dnia: st, nd, rd albo th. Używaj po jth
zDzień roku, od 072

Tydzień i miesiąc

ZnakZnaczeniePrzykład
WNumer tygodnia ISO 8601 (tygodnie zaczynają się w poniedziałek)11
FPełna nazwa miesiącaMarch
MKrótka nazwa miesiąca, 3 literyMar
mNumer miesiąca z zerem wiodącym (01 do 12)03
nNumer miesiąca bez zera wiodącego (1 do 12)3
tLiczba dni w miesiącu31

Rok

ZnakZnaczeniePrzykład
YPełny rok, co najmniej 4 cyfry2026
yRok, 2 cyfry26
L1, jeśli rok jest przestępny, w przeciwnym razie 00
oRok numeracji tygodni ISO 8601 (używaj z W)2026
XRozszerzony pełny rok ze znakiem (PHP 8.2+)+2026
xRozszerzony pełny rok, znak tylko gdy potrzebny (PHP 8.2+)2026

Czas

ZnakZnaczeniePrzykład
HGodzina, zegar 24-godzinny, zero wiodące (00 do 23)09
GGodzina, zegar 24-godzinny, bez zera wiodącego (0 do 23)9
hGodzina, zegar 12-godzinny, zero wiodące (01 do 12)09
gGodzina, zegar 12-godzinny, bez zera wiodącego (1 do 12)9
iMinuty z zerem wiodącym (00 do 59)05
sSekundy z zerem wiodącym (00 do 59)07
aam albo pmam
AAM albo PMAM
vMilisekundy123
uMikrosekundy (w date(), które przyjmuje pełne sekundy, zawsze 000000)123456
BCzas internetowy Swatch (000 do 999)420

Strefa czasowa

ZnakZnaczeniePrzykład
eIdentyfikator strefy czasowejUTC
TSkrót strefy czasowejUTC
PPrzesunięcie względem UTC z dwukropkiem+00:00
pJak P, ale Z dla UTCZ
OPrzesunięcie względem UTC bez dwukropka+0000
ZPrzesunięcie w sekundach0
I (wielkie i)1 w czasie letnim, w przeciwnym razie 00

Pełna data i godzina

ZnakZnaczeniePrzykład
cData i godzina ISO 86012026-03-14T09:05:07+00:00
rData RFC 2822, używana w nagłówkach e-mailiSat, 14 Mar 2026 09:05:07 +0000
UZnacznik czasu Unix (sekundy od 1970-01-01 UTC)1773479107

Ta sama tabela na żywo: ten blok wypisuje każdy znak dla wybranej daty. Wstaw swoje urodziny, datę po południu albo koniec roku przestępnego:

Litery i słowa wewnątrz formatu

Każda litera w stringu formatu jest czytana jako znak formatu, więc 'Today is l' nie wypisuje „Today is”: T, o, d, a, y, i i s to wszystko znaki formatu. Postaw ukośnik wsteczny przed każdą literą, którą chcesz wypisać bez zmian. W stringu w podwójnych cudzysłowach \t jest już znakiem tabulacji, więc formaty z ukośnikami wstecznymi pisz w pojedynczych cudzysłowach:

Wynik:

UTC202614am26 0507 Saturday
Today is Saturday
Saturday the 14th of March
2026-03-14T09:05:07
Saturday 	09UTC 14th

Popularne formaty dat

Większość kodu potrzebuje tylko kilku formatów. Ten blok wypisuje je jako tabelę HTML, więc pojawia się w zakładce Page:

Przechowuj i porównuj daty jako Y-m-d albo Y-m-d H:i:s: stringi w tej kolejności sortują się tak samo jak daty, czego nie robią stringi d/m/Y ani polskie d.m.Y.

ISO 8601, DATE_ATOM i inne standardowe formaty

PHP ma stałe dla formatów, których oczekują API, kanały i ciasteczka. DATE_ATOM (także DateTimeInterface::ATOM) to ISO 8601 i RFC 3339, format używany przez API w JSON:

Wynik:

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

Istnieje też stała DATE_ISO8601, ale jej przesunięcie nie ma dwukropka (+0000), na co ISO 8601 w tej postaci nie pozwala; używaj DATE_ATOM.

Japoński format daty (Y年m月d日)

Znaki, które nie są literami formatu, są wypisywane bez zmian, także kanji, więc 'Y年n月j日' działa tak, jak jest zapisane. n i j pomijają zero wiodące (3月14日), a m i d je zachowują (03月14日). Nazwa dnia to jedyna część, której date() nie przetłumaczy, bo zna tylko angielskie nazwy; zamiast tego przypisz liczbie w własną listę (tak samo zrobisz z polskimi nazwami dni):

Wynik:

2026年3月14日
2026年03月14日 09時05分
2026年3月14日(土)
2026/03/14

Do pełnej lokalizacji, w tym nazw miesięcy w innych językach i japońskiej ery (令和), IntlDateFormatter z rozszerzenia intl formatuje według wzorców locale. Używa liter wzorców ICU (yyyy, MM, EEEE), a nie znaków PHP z tej strony:

<?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日

Konwersja daty z jednego formatu na inny

Aby zamienić 14/03/2026 na 2026-03-14, sparsuj string formatem, w którym jest zapisany, przez DateTimeImmutable::createFromFormat(), a potem sformatuj go ponownie. Używa tych samych znaków co tabela. Zacznij format od !, inaczej pola, których nie podałeś (tutaj godzina), zostaną wypełnione z bieżącej chwili:

Wynik:

2026-03-14 00:00:00
March 14, 2026
bool(false)
2026-03-03
Array
(
    [10] => The parsed date was invalid
)

Przy datach wpisywanych przez użytkowników traktuj każde ostrzeżenie z getLastErrors() jako niepoprawną datę, tak samo jak false.

Częste błędy z formatami dat

Trzy błędy pojawiają się raz po raz: m tam, gdzie miało być i, Y kontra y oraz pozwalanie, by strtotime() zgadywało kolejność dnia i miesiąca. strtotime() czyta ukośniki w amerykańskiej kolejności miesiąc/dzień, a myślniki i kropki w kolejności dzień-miesiąc, więc te same cyfry dają dwie różne daty:

Wynik:

09:03:07
09:05:07
14/03/26
2026-03-04
2026-04-03
bool(false)

Gdy znasz format danych wejściowych, podaj go przez createFromFormat(), zamiast pozwalać strtotime() zgadywać.

Najczęściej zadawane pytania

Co oznacza date('Y-m-d') w PHP?

Każda litera jest zastępowana częścią daty: Y to rok z 4 cyframi, m miesiąc z zerem wiodącym, a d dzień z zerem wiodącym, natomiast myślniki są wypisywane bez zmian. 14 marca 2026 zwraca 2026-03-14.

Jak zamienić datę z jednego formatu na inny w PHP?

Sparsuj ją formatem, w którym jest zapisana, a potem sformatuj tym, którego chcesz: DateTimeImmutable::createFromFormat('!d/m/Y', '14/03/2026')->format('Y-m-d') zwraca 2026-03-14. createFromFormat() zwraca false, gdy string nie pasuje, więc najpierw to sprawdź.

Czym różni się m od i w formacie daty PHP?

m to miesiąc (01 do 12), a i to minuty (00 do 59). Napisanie 'H:m' zamiast 'H:i' to częsty błąd: godzina pokazuje numer miesiąca tam, gdzie powinny być minuty.

Jak sformatować datę jako ISO 8601 w PHP?

Użyj znaku c albo stałej DATE_ATOM: $date->format(DATE_ATOM) zwraca 2026-03-14T09:05:07+00:00. Unikaj DATE_ISO8601: jego przesunięcie nie ma dwukropka (+0000), co nie jest poprawnym ISO 8601.

Jak pokazać dzień tygodnia po polsku lub japońsku w date()?

date() wypisuje tylko angielskie nazwy, więc przypisz liczbie w (0 dla niedzieli do 6 dla soboty) własną listę, na przykład japońską: ['日','月','火','水','木','金','土'][$date->format('w')]. Z rozszerzeniem intl IntlDateFormatter potrafi formatować całe daty w dowolnym locale.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ