Czego się nauczysz?
- Obsługi formularzy HTML i walidacji danych w PHP
- Pracy z datami i obliczania różnic miedzy nimi
- Wykorzystania klasy DateTime i metody diff()
- Zapisu i odczytu danych z plikow JSON
Stworzysz Kalkulator wieku - aplikacje umozliwiajaca obliczenie dokładnego wieku na podstawie daty urodzenia. Użytkownik wprowadza date urodzenia, a system oblicza wiek w latach, miesiacach i dniach. Historia obliczen jest zapisywana do pliku JSON.
Czego się nauczysz?
W prawdziwej pracy...
Obliczenia dat sa wszechobecne w programowaniu - od weryfikacji wieku użytkownika (18+), przez systemy rezerwacji, po kalkulatory ubezpieczeniowe i emerytalne. Klasa DateTime w PHP to potezne narzedzie, które każdy programista powinien dobrze znac.
Formularz wprowadzania daty urodzenia Użytkownik podaje date urodzenia w formacie daty (input type=“date”).
Obliczenie wieku System oblicza wiek w pełnych latach i wyświetla wynik w czytelnej formie.
Zapis do historii Każde obliczenie jest zapisywane do pliku JSON wraz z data wykonania.
Przykładowa struktura pliku JSON:
{ "calculations": [ { "id": 1, "name": "Jan Kowalski", "birth_date": "2008-04-15", "age_years": 17, "age_months": 10, "age_days": 2, "days_to_birthday": 57, "created_at": "2026-02-17 10:30:00" }, { "id": 2, "name": "Anna Nowak", "birth_date": "1990-12-24", "age_years": 35, "age_months": 1, "age_days": 24, "days_to_birthday": 310, "created_at": "2026-02-17 11:15:00" } ]}Wymagane funkcje:
Przykładowy scenariusz:
Ocena: 3.0Użytkownik wchodzi na strone i widzi formularz. Wybiera date urodzenia 15.04.2008 z kalendarza. Po kliknieciu “Oblicz” widzi wynik: “Masz 17 lat”. Obliczenie zostaje zapisane do pliku JSON.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Użytkownik wpisuje imie “Jan” i wybiera date. Po obliczeniu widzi: “Jan, masz 17 lat, 10 miesiecy i 2 dni”. Pod formularzem widzi tabele z poprzednimi obliczeniami. Przy probie wpisania daty z przyszłości widzi komunikat błędu.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Użytkownik dodaje członków rodziny z datami urodzin. Widzi liste posortowana po najblizszych urodzinach: “Anna - urodziny za 23 dni!”. Przy każdej osobie widzi znak zodiaku i dzień tygodnia urodzenia. Może wyeksportowac liste do CSV.
Walidacja daty urodzenia:
$birthDate = $_POST['birth_date'] ?? '';$errors = [];
if (empty($birthDate)) { $errors[] = "Podaj date urodzenia";} else { $birth = new DateTime($birthDate); $today = new DateTime('today');
if ($birth > $today) { $errors[] = "Data urodzenia nie może być z przyszłości"; }}Obliczenie wieku (lata, miesiace, dni):
$birth = new DateTime($birthDate);$today = new DateTime('today');$diff = $birth->diff($today);
$years = $diff->y; // Pełne lata$months = $diff->m; // Pełne miesiace (po odjeciu lat)$days = $diff->d; // Dni (po odjeciu lat i miesiecy)
echo "Masz $years lat, $months miesiecy i $days dni";Obliczenie dni do urodzin:
function daysUntilBirthday($birthDate) { $birth = new DateTime($birthDate); $today = new DateTime('today');
// Urodziny w tym roku $birthdayThisYear = new DateTime($today->format('Y') . $birth->format('-m-d'));
// Jeśli urodziny już były, bierz przyszłoroczne if ($birthdayThisYear < $today) { $birthdayThisYear->modify('+1 year'); }
return $today->diff($birthdayThisYear)->days;}Dzień tygodnia urodzenia:
$birth = new DateTime($birthDate);$dayOfWeek = $birth->format('l'); // Monday, Tuesday, etc.
// Po polsku:$daysPolish = [ 'Monday' => 'poniedziałek', 'Tuesday' => 'wtorek', 'Wednesday' => 'środa', 'Thursday' => 'czwartek', 'Friday' => 'piątek', 'Saturday' => 'sobota', 'Sunday' => 'niedziela'];echo "Urodziłeś się w " . $daysPolish[$dayOfWeek];Znak zodiaku:
function getZodiacSign($month, $day) { $signs = [ ['Koziorozec', 1, 19], ['Wodnik', 2, 18], ['Ryby', 3, 20], ['Baran', 4, 19], ['Byk', 5, 20], ['Bliznieta', 6, 20], ['Rak', 7, 22], ['Lew', 8, 22], ['Panna', 9, 22], ['Waga', 10, 22], ['Skorpion', 11, 21], ['Strzelec', 12, 21], ['Koziorozec', 12, 31] ];
foreach ($signs as $sign) { if ($month == $sign[1] && $day <= $sign[2]) { return $sign[0]; } if ($month < $sign[1]) { return $signs[array_search($sign, $signs) - 1][0]; } } return 'Koziorozec';}Wykorzystaj lekcje!
Cotygodniowe spotkania podczas lekcji to idealny moment, by:
Pracuj iteracyjnie - lepiej mieć działający wariant A niz niedokonczony C!