Prawidłowy wybór to <input type="time" id="minutes" name="hours">, ponieważ dokładnie taki element HTML5 służy do wprowadzania godziny w formacie hh:mm, czyli tak jak na ilustracji. Atrybut type="time" mówi przeglądarce, że pole ma przyjmować tylko wartości czasu, bez daty, miesięcy czy liczb dowolnego typu. Zgodnie ze specyfikacją HTML Living Standard oraz HTML5, przeglądarka powinna wtedy wyświetlić natywne kontrolki do wyboru godziny (np. rozwijane listy, suwak, mały zegarek – zależy od systemu i przeglądarki). Dzięki temu użytkownik ma mniejsze ryzyko pomyłki, a walidacja odbywa się częściowo automatycznie. Z mojego doświadczenia warto korzystać z type="time" zawsze, gdy formularz dotyczy konkretnych godzin, np. godzina rozpoczęcia pracy, rezerwacja wizyty, planowanie spotkania online. Po stronie serwera (np. w PHP) to pole przychodzi jako tekst w formacie „HH:MM”, co jest łatwe do dalszego przetwarzania, parsowania do obiektu DateTime albo zapisu w bazie danych w typie TIME. Dobra praktyka jest też taka, żeby nazwy atrybutów id i name były semantyczne. W tym zadaniu nie ma to wpływu na poprawność odpowiedzi, ale w realnym projekcie lepiej byłoby użyć np. id="endTime" i name="end_time". Ułatwia to później pracę z JavaScriptem i po stronie backendu. Warto też pamiętać o dodaniu atrybutów min i max, jeśli chcemy ograniczyć zakres godzin (np. od 08:00 do 20:00), oraz pattern lub dodatkowej walidacji JS, jeśli mamy specyficzne wymagania. Mimo że ilustracja nie pokazuje tych szczegółów, sam mechanizm type="time" jest tu absolutnie kluczowy i zgodny z dobrymi praktykami front-endowymi.
W tym zadaniu kluczowe jest zrozumienie różnic pomiędzy poszczególnymi typami pól formularza w HTML5. Ilustracja pokazuje prosty formularz, w którym użytkownik ma podać godzinę zakończenia egzaminu w formacie hh:mm. To oznacza, że interesuje nas wyłącznie czas (godziny i minuty), bez daty, bez miesiąca, bez liczb z dowolnego zakresu. HTML5 wprowadził specjalne typy pól właśnie po to, żeby takie sytuacje obsługiwać dokładnie i w sposób przewidywalny. Element z type="month" służy do wyboru miesiąca i roku, zwykle w formacie RRRR-MM. Przeglądarka wyświetla wtedy kontrolkę pozwalającą wybrać miesiąc, a nie godzinę. Użycie go do wprowadzania czasu byłoby kompletnie nieintuicyjne dla użytkownika i łamałoby założenia semantycznego HTML. To jest typowy błąd: patrzymy na atrybut i myślimy „month, minutes, coś z czasem”, a to zupełnie inny zakres danych. Z kolei pole type="date" obsługuje pełną datę, najczęściej w formacie RRRR-MM-DD. Tu pojawia się kolejna pułapka: skoro egzamin ma jakąś datę, to może warto użyć date? Tylko że w treści i na ilustracji mowa jest wyraźnie o godzinie zakończenia, a nie o dniu egzaminu. type="date" wyświetli kalendarz, co kompletnie nie pasuje do opisu formatu „hh : mm” i wprowadzałoby użytkownika w błąd. Ostatnia propozycja, type="number" z zakresem min="0" max="24", wygląda na pierwszy rzut oka kusząco, bo pozwala ograniczyć wartości do liczb. Jednak takie pole nie rozumie pojęcia czasu, nie ma formatu hh:mm, nie waliduje dwóch części (godziny i minuty), a dodatkowo zakres 0–24 jest nieprecyzyjny (co z minutami, co z 23:59 itd.). To tylko surowa liczba, bez kontekstu semantycznego. W praktyce zmuszałoby to programistę do pisania dodatkowej logiki walidującej i parsującej. Cały sens HTML5 polega na tym, żeby dobierać typy pól zgodnie z danymi, które użytkownik ma wprowadzić. Wtedy przeglądarka może pomóc z walidacją, dostępnością i wygodą obsługi na urządzeniach mobilnych. Wybór innego typu niż time w tym konkretnym przypadku jest więc nie tylko formalnie błędny, ale też sprzeczny z dobrymi praktykami projektowania formularzy webowych.