Úloha 23: Školní zvonění (časové výpočty a skloňování)

Pokročilý MySQL časové funkce date() a time() české skloňování responzivní tabulka

Cíl úlohy

Vytvořte skript pro zobrazení denního rozpisu školního zvonění (vyučovací hodiny a přestávky). Skript porovná rozvrh s aktuálním reálným časem na serveru, automaticky barevně zvýrazní právě probíhající hodinu nebo přestávku, spočítá zbývající čas a správně česky vyskloňuje počet zbývajících minut (1 minuta, 2 minuty, 5 minut).

Časové funkce v SQL a převod na minuty

V databázi jsou časy uloženy jako datový typ TIME (např. 07:55:00 a 08:40:00). Pro snadné porovnávání převádíme časy na počet minut od půlnoci:

SELECT
    DATE_FORMAT(od, '%k:%i') AS odU,
    DATE_FORMAT(do, '%k:%i') AS doU,
    MINUTE(SUBTIME(do, od)) + HOUR(SUBTIME(do, od)) * 60 AS delka,
    popis,
    MINUTE(od) + HOUR(od) * 60 AS odMinut,
    MINUTE(do) + HOUR(do) * 60 AS doMinut
FROM ulohy_zvoneni
ORDER BY od ASC;

V PHP pak stačí zjistit aktuální minutu od půlnoci: $ted = date('G') * 60 + date('i'); a otestovat podmínku $ted >= $odMinut && $ted < $doMinut.

Úvahy a doporučený postup řešení

  • České skloňování minut:
    • Zbývá 1 minuta (číslo 1)
    • Zbývají 2, 3, 4 minuty (čísla 2 až 4)
    • Zbývá 0 minut, 5 minut a více
  • Rozdělení do dvou sloupců: Na velkých obrazovkách je přehlednější zobrazit dopolední a odpolední vyučování vedle sebe, zatímco na mobilu pod sebou (pomocí CSS flexboxu nebo gridu).
  • Víkendy: Můžete přidat kontrolu date('N') >= 6 (sobota a neděle), kdy vyučování neprobíhá.

Doplňující otázky k zamyšlení a náměty na rozšíření

  • 1. Jak v JavaScriptu zařídit, aby se stránka se zvoněním každou minutu automaticky aktualizovala bez zásahu uživatele (např. pomocí setTimeout() nebo setInterval())?
  • 2. Jak zohlednit časová pásma v PHP (např. date_default_timezone_set('Europe/Prague'))?
  • 3. Jak byste skript rozšířili o grafický ukazatel průběhu hodiny (progress bar vyjadřující kolik procent z aktuální hodiny již uplynulo)?

Vyzkoušejte funkční řešení: Otevřít vzorovou úlohu zvoneni.php