Czego się nauczysz?
- Pracy z czasem i godzinami w PHP
- Obliczania różnicy między godzinami
- Formatowania czasu (godziny:minuty)
- Generowania raportów okresowych
This content is not available in your language yet.
Stworzysz Kalkulator czasu pracy - aplikację webową do rejestrowania i obliczania przepracowanych godzin. Użytkownik wprowadza godzinę rozpoczęcia i zakończenia pracy, a system automatycznie oblicza czas pracy i zapisuje wpis do historii. Aplikacja pomaga śledzić czas pracy i generować raporty.
Czego się nauczysz?
W prawdziwej pracy...
Systemy ewidencji czasu pracy to podstawa w każdej firmie - od prostych rejestrów po zaawansowane systemy HR. Umiejętność pracy z czasem i generowania raportów jest niezbędna w aplikacjach biznesowych, projektowych i freelancerskich.
Wprowadzanie czasu pracy Użytkownik podaje datę, godzinę rozpoczęcia i zakończenia pracy. Opcjonalnie może dodać opis wykonanych zadań.
Obliczenie przepracowanego czasu System automatycznie oblicza ile godzin i minut trwała praca i wyświetla wynik.
Historia wpisów Wszystkie wpisy są zapisywane do pliku JSON i wyświetlane w formie listy/tabeli.
Przykładowa struktura pliku JSON:
{ "entries": [ { "id": 1, "date": "2026-02-13", "start_time": "08:00", "end_time": "16:30", "duration_minutes": 510, "description": "Programowanie PHP", "created_at": "2026-02-13 16:35:00" }, { "id": 2, "date": "2026-02-14", "start_time": "09:00", "end_time": "17:00", "duration_minutes": 480, "description": "Spotkanie z klientem, kodowanie", "created_at": "2026-02-14 17:05:00" } ]}Wymagane funkcje:
Przykładowy scenariusz:
Ocena: 3.0Pracownik kończy pracę i wpisuje: data 13.02.2026, start 08:00, koniec 16:30. System pokazuje: “Przepracowano: 8 godzin 30 minut”. Wpis pojawia się na liście.
Wszystko z wariantu A, plus:
Przykładowy scenariusz:
Ocena: 4.0-5.0Pracownik filtruje historię wybierając “ten tydzień” i widzi: “Poniedziałek: 8h 30min, Wtorek: 8h 00min… Suma tygodnia: 42h 30min”. Przy każdym wpisie widzi opis zadań.
Wszystko z wariantu B, plus:
Przykładowy scenariusz:
Ocena: 5.0-6.0Na koniec miesiąca pracownik generuje raport: “Luty 2026: 168h przepracowanych, 8h nadgodzin, średnio 8h 24min dziennie”. Eksportuje do CSV dla księgowości. Zauważa błąd - edytuje wpis z 14.02.
Obliczanie czasu pracy:
<?php$startTime = $_POST['start_time']; // "08:00"$endTime = $_POST['end_time']; // "16:30"
$start = strtotime($startTime);$end = strtotime($endTime);
if ($end <= $start) { $errors[] = 'Godzina zakończenia musi być późniejsza niż rozpoczęcia';} else { $durationMinutes = ($end - $start) / 60; $hours = floor($durationMinutes / 60); $minutes = $durationMinutes % 60;
echo "Przepracowano: {$hours}h {$minutes}min";}?>Walidacja formatu godziny:
<?phpfunction isValidTime($time) { return preg_match('/^([01]?[0-9]|2[0-3]):[0-5][0-9]$/', $time);}
if (!isValidTime($_POST['start_time'])) { $errors[] = 'Nieprawidłowy format godziny rozpoczęcia';}?>Suma godzin z okresu:
<?php$entries = json_decode(file_get_contents('entries.json'), true)['entries'];
// Filtruj wpisy z bieżącego tygodnia$weekStart = date('Y-m-d', strtotime('monday this week'));$weekEnd = date('Y-m-d', strtotime('sunday this week'));
$weekEntries = array_filter($entries, function($entry) use ($weekStart, $weekEnd) { return $entry['date'] >= $weekStart && $entry['date'] <= $weekEnd;});
$totalMinutes = array_sum(array_column($weekEntries, 'duration_minutes'));$totalHours = floor($totalMinutes / 60);$remainingMinutes = $totalMinutes % 60;
echo "Suma tygodnia: {$totalHours}h {$remainingMinutes}min";?>Formatowanie czasu pracy:
<?phpfunction formatDuration($minutes) { $hours = floor($minutes / 60); $mins = $minutes % 60;
if ($hours > 0 && $mins > 0) { return "{$hours}h {$mins}min"; } elseif ($hours > 0) { return "{$hours}h"; } else { return "{$mins}min"; }}
echo formatDuration(510); // "8h 30min"?>Wyróżnienie nadgodzin:
<?php$standardDay = 8 * 60; // 480 minut = 8 godzin
foreach ($entries as $entry) { $isOvertime = $entry['duration_minutes'] > $standardDay; $overtimeMinutes = max(0, $entry['duration_minutes'] - $standardDay);
$class = $isOvertime ? 'overtime' : 'normal'; echo "<tr class=\"$class\">"; echo "<td>{$entry['date']}</td>"; echo "<td>" . formatDuration($entry['duration_minutes']) . "</td>"; if ($isOvertime) { echo "<td class=\"overtime-badge\">+" . formatDuration($overtimeMinutes) . "</td>"; } echo "</tr>";}?>
<style>.overtime { background-color: #fff3cd; }.overtime-badge { color: #dc3545; font-weight: bold; }</style>Raport miesięczny:
<?php$month = $_GET['month'] ?? date('Y-m'); // "2026-02"
$monthEntries = array_filter($entries, function($entry) use ($month) { return substr($entry['date'], 0, 7) === $month;});
$totalMinutes = array_sum(array_column($monthEntries, 'duration_minutes'));$workDays = count($monthEntries);$avgMinutes = $workDays > 0 ? $totalMinutes / $workDays : 0;$overtimeMinutes = max(0, $totalMinutes - ($workDays * 8 * 60));
echo "Miesiąc: $month<br>";echo "Dni pracy: $workDays<br>";echo "Łączny czas: " . formatDuration($totalMinutes) . "<br>";echo "Średnio dziennie: " . formatDuration(round($avgMinutes)) . "<br>";echo "Nadgodziny: " . formatDuration($overtimeMinutes);?>Wykorzystaj lekcje!
Cotygodniowe spotkania podczas lekcji to idealny moment, by:
Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!