Skip to content

⏱ Kalkulator czasu pracy

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?

  • Pracy z czasem i godzinami w PHP
  • Obliczania różnicy między godzinami
  • Formatowania czasu (godziny:minuty)
  • Generowania raportów okresowych

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.

  1. Wprowadzanie czasu pracy Użytkownik podaje datę, godzinę rozpoczęcia i zakończenia pracy. Opcjonalnie może dodać opis wykonanych zadań.

  2. Obliczenie przepracowanego czasu System automatycznie oblicza ile godzin i minut trwała praca i wyświetla wynik.

  3. 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:

  • Formularz: data, godzina rozpoczęcia, godzina zakończenia
  • Walidacja w PHP (poprawne godziny, zakończenie > rozpoczęcie)
  • Obliczenie i wyświetlenie czasu pracy
  • Zapis wpisu do pliku JSON
  • Lista wszystkich wpisów

Przykładowy scenariusz:

Pracownik 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.

Ocena: 3.0

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:

<?php
function 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:

<?php
function 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:

  • Pokazać postępy - nawet małe kroki się liczą
  • Wyjaśnić wątpliwości - pytaj, nie zgaduj
  • Skonsultować rozwiązania - feedback pomoże Ci się rozwijać

Pracuj iteracyjnie - lepiej mieć działający wariant A niż niedokończony C!