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.