Menu

date() w PHP: pobieranie, formatowanie i obliczanie dat

date('Y-m-d') zwraca dzisiejszą datę jako string, a date('Y-m-d', $timestamp) formatuje dowolny znacznik czasu Unix. Poznaj time(), mktime(), strtotime(), DateTimeImmutable, dodawanie dni, różnicę między dwiema datami i strefy czasowe, z przykładami do uruchomienia.

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

date('Y-m-d') zwraca dzisiejszą datę jako string, na przykład 2026-03-14. Pierwszy argument to string formatu, w którym każda litera oznacza część daty (Y rok, m miesiąc, d dzień, H:i:s godzinę), a opcjonalny drugi argument to znacznik czasu Unix do sformatowania zamiast bieżącej chwili.

Wynik zmienia się przy każdym naciśnięciu Run, bo to bieżąca data i godzina w UTC. Każdą literę stringa formatu i sposób wstawiania zwykłego tekstu między nimi opisuje strona o formacie daty w PHP.

Znaczniki czasu: time(), mktime() i strtotime()

Znacznik czasu Unix to liczba sekund od 1 stycznia 1970 o północy UTC. time() zwraca bieżący, mktime(hour, minute, second, month, day, year) buduje go z części, a strtotime() czyta datę zapisaną po angielsku ('2026-03-14', '+1 week', 'next monday'). Dowolny znacznik czasu przekaż jako drugi argument date(). Drugi argument strtotime() to chwila, od której liczy się względne wyrażenie; bez niego liczy od teraz.

Wynik:

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)

Przewijanie w mktime() jest przydatne: dzień 0 miesiąca to ostatni dzień miesiąca poprzedniego, więc mktime(0, 0, 0, 3, 0, 2026) to 28 lutego. Zawsze porównuj wynik z false, zanim przekażesz go dalej: date('Y-m-d', false) po cichu wypisuje 1970-01-01, datę, o którą nikomu nie chodziło.

Dodawanie dni do daty

Do wszystkiego poza wypisywaniem używaj DateTimeImmutable. Jego metoda modify() przyjmuje te same wyrażenia co strtotime() i zwraca nową datę, a add() przyjmuje DateInterval, taki jak P7D (okres 7 dni) albo PT90M (90 minut).

Wynik:

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

31 lutego nie istnieje, więc +1 month od 31 stycznia ląduje na 3 marca. Gdy chodzi ci o „koniec następnego miesiąca”, powiedz to wprost przez last day of next month.

DateTime vs DateTimeImmutable

DateTime zmienia sam siebie, gdy wywołujesz modify(), add() lub setDate(), i zwraca ten sam obiekt. To zaskakuje osoby, które trzymają oryginalną datę w zmiennej:

Wynik:

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

W nowym kodzie wybieraj DateTimeImmutable. Obie klasy mają te same metody i obie implementują DateTimeInterface, więc funkcja może przyjąć dowolną z nich.

Różnica między dwiema datami

diff() zwraca DateInterval. Jego właściwość days to łączna liczba dni między dwiema datami, a y, m i d dzielą różnicę na lata, miesiące i dni, czyli dokładnie to, czego potrzebuje obliczanie wieku. Zmień daty i uruchom ponownie:

Wynik:

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

W format() %a to łączna liczba dni, a %d tylko część dni, więc do „dni do” używaj %a. Aby porównać dwie daty bez obliczania różnicy, na obiektach dat działają zwykłe operatory: $today < $christmas daje true.

Strefy czasowe

date() i new DateTimeImmutable() używają domyślnej strefy czasowej, która pochodzi z date.timezone w php.ini (UTC, gdy nie jest ustawiona). Ustaw ją dla całego skryptu przez date_default_timezone_set() albo daj pojedynczej dacie własny DateTimeZone i konwertuj przez setTimezone():

Wynik:

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

Znacznik czasu to wszędzie ta sama liczba; strefa czasowa zmienia tylko sposób jego zapisu. Dlatego zwykła rada brzmi: przechowuj daty w UTC i konwertuj je przy wyświetlaniu.

Kalendarz na stronie WWW

Daty najczęściej wypisuje się do HTML. Ten blok rysuje bieżący miesiąc jako kalendarz i wyróżnia dzisiejszy dzień. Uruchom, a potem kliknij Previous albo Next: ten sam skrypt uruchomi się ponownie z $_GET['m'] ustawionym z linku, na przykład ?m=2026-04.

format('N') daje dzień tygodnia jako 1 (poniedziałek) do 7 (niedziela), czyli liczbę pustych komórek przed pierwszym dniem, a format('t') daje liczbę dni w miesiącu. ! w '!Y-m' zeruje każde pole, którego format nie wymienia, więc dzień to 1., a godzina to północ.

Częste błędy z date()

Drugi argument date() musi być znacznikiem czasu, a nie stringiem z datą. Ta linia:

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

zatrzymuje skrypt z TypeError:

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

Najpierw zamień string przez strtotime() albo obiekt:

Wynik:

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

Na dwie kolejne rzeczy też uważaj: m to miesiąc, a i to minuty, więc 'H:m' wypisuje miesiąc tam, gdzie chciałeś minut; a new DateTimeImmutable('garbage') rzuca wyjątek zamiast zwrócić false, więc dane od użytkownika otaczaj try/catch albo parsuj przez DateTimeImmutable::createFromFormat(), które przy niedopasowaniu zwraca false.

Najczęściej zadawane pytania

Jak pobrać aktualną datę w PHP?

Wywołaj date() ze stringiem formatu: echo date('Y-m-d'); wypisuje dzisiejszą datę, na przykład 2026-03-14, a date('Y-m-d H:i:s') dodaje godzinę. Wersja obiektowa to (new DateTimeImmutable())->format('Y-m-d').

Jak dodać dni do daty w PHP?

Użyj modify() na DateTimeImmutable: (new DateTimeImmutable('2026-03-14'))->modify('+7 days')->format('Y-m-d') daje 2026-03-21. Ze znacznikami czasu to samo robi date('Y-m-d', strtotime('+7 days', $timestamp)).

Jak obliczyć różnicę między dwiema datami w PHP?

Wywołaj diff() na jednej dacie z drugą jako argumentem: $a->diff($b) zwraca DateInterval. Jego właściwość days to łączna liczba dni, a y, m, d zawierają lata, miesiące i dni, i tak oblicza się czyjś wiek.

Jak zamienić znacznik czasu Unix na datę w PHP?

Przekaż go jako drugi argument date(): date('Y-m-d H:i:s', 1773479107) zwraca 2026-03-14 09:05:07 w UTC. Dla obiektu użyj new DateTimeImmutable('@1773479107').

Dlaczego date() w PHP pokazuje złą godzinę?

date() używa domyślnej strefy czasowej, która pochodzi z date.timezone w php.ini i często jest to UTC. Ustaw własną przez date_default_timezone_set('Europe/Warsaw') na początku skryptu albo przekaż DateTimeZone do DateTimeImmutable.

Ilustracja języków programowania w Coddy

Ucz się programowania z Coddy

ZACZNIJ