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ń
| Znak | Znaczenie | Przykład |
|---|---|---|
d | Dzień miesiąca, 2 cyfry z zerem wiodącym (01 do 31) | 14 |
j | Dzień miesiąca bez zera wiodącego (1 do 31) | 14 |
D | Krótka nazwa dnia, 3 litery | Sat |
l (małe L) | Pełna nazwa dnia | Saturday |
N | Dzień tygodnia ISO, 1 (poniedziałek) do 7 (niedziela) | 6 |
w | Dzień tygodnia, 0 (niedziela) do 6 (sobota) | 6 |
S | Angielski przyrostek dnia: st, nd, rd albo th. Używaj po j | th |
z | Dzień roku, od 0 | 72 |
Tydzień i miesiąc
| Znak | Znaczenie | Przykład |
|---|---|---|
W | Numer tygodnia ISO 8601 (tygodnie zaczynają się w poniedziałek) | 11 |
F | Pełna nazwa miesiąca | March |
M | Krótka nazwa miesiąca, 3 litery | Mar |
m | Numer miesiąca z zerem wiodącym (01 do 12) | 03 |
n | Numer miesiąca bez zera wiodącego (1 do 12) | 3 |
t | Liczba dni w miesiącu | 31 |
Rok
| Znak | Znaczenie | Przykład |
|---|---|---|
Y | Pełny rok, co najmniej 4 cyfry | 2026 |
y | Rok, 2 cyfry | 26 |
L | 1, jeśli rok jest przestępny, w przeciwnym razie 0 | 0 |
o | Rok numeracji tygodni ISO 8601 (używaj z W) | 2026 |
X | Rozszerzony pełny rok ze znakiem (PHP 8.2+) | +2026 |
x | Rozszerzony pełny rok, znak tylko gdy potrzebny (PHP 8.2+) | 2026 |
Czas
| Znak | Znaczenie | Przykład |
|---|---|---|
H | Godzina, zegar 24-godzinny, zero wiodące (00 do 23) | 09 |
G | Godzina, zegar 24-godzinny, bez zera wiodącego (0 do 23) | 9 |
h | Godzina, zegar 12-godzinny, zero wiodące (01 do 12) | 09 |
g | Godzina, zegar 12-godzinny, bez zera wiodącego (1 do 12) | 9 |
i | Minuty z zerem wiodącym (00 do 59) | 05 |
s | Sekundy z zerem wiodącym (00 do 59) | 07 |
a | am albo pm | am |
A | AM albo PM | AM |
v | Milisekundy | 123 |
u | Mikrosekundy (w date(), które przyjmuje pełne sekundy, zawsze 000000) | 123456 |
B | Czas internetowy Swatch (000 do 999) | 420 |
Strefa czasowa
| Znak | Znaczenie | Przykład |
|---|---|---|
e | Identyfikator strefy czasowej | UTC |
T | Skrót strefy czasowej | UTC |
P | Przesunięcie względem UTC z dwukropkiem | +00:00 |
p | Jak P, ale Z dla UTC | Z |
O | Przesunięcie względem UTC bez dwukropka | +0000 |
Z | Przesunięcie w sekundach | 0 |
I (wielkie i) | 1 w czasie letnim, w przeciwnym razie 0 | 0 |
Pełna data i godzina
| Znak | Znaczenie | Przykład |
|---|---|---|
c | Data i godzina ISO 8601 | 2026-03-14T09:05:07+00:00 |
r | Data RFC 2822, używana w nagłówkach e-maili | Sat, 14 Mar 2026 09:05:07 +0000 |
U | Znacznik 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.