Tracks
/
Elm
Elm
/
Übungen
/
Kurokos Uhr
Kurokos Uhr

Kurokos Uhr

Lernübung

Einführung

Zeit

Das Modul Time wird verwendet, um menschenlesbare Datums- und Zeitangaben anzuzeigen. Auch wenn es technisch möglich ist, Zeiten mit Time zu bearbeiten, gibt es Elm-Community-Pakete, die für diese Aufgabe viel besser geeignet sind, wie zum Beispiel justinmimbs/date oder CoderDennis/elm-time-format.

Posix

Zeiten werden durch den opaken Typ Posix dargestellt, der die Unix-Epochenzeit kapselt, also die Anzahl der Millisekunden, die seit dem 1. Januar 1970 um Mitternacht UTC vergangen sind. Ein Posix ist ein eindeutiger Wert, der sich nicht je nach Zeitzone ändert, und daher gut geeignet, um Zeitwerte zu speichern. In einer Elm-Anwendung werden Posix-Zeiten normalerweise von externen Quellen bereitgestellt, etwa vom Browser.

Es ist möglich, ein Posix mit den folgenden Funktionen in eine Anzahl von Millisekunden umzuwandeln und umgekehrt:

posixToMillis : Posix -> Int
millisToPosix : Int -> Posix

Zeitzonen

In unserem Alltag lesen wir Menschen normalerweise kein Posix. Stattdessen bevorzugen wir die lokale Zeit, die von unserem Standort auf der Erde und den lokalen Sommerzeitregeln abhängt. In Elm wird diese Information im opaken Typ Zone kodiert, der normalerweise vom Browser bereitgestellt wird.

Es gibt eine spezielle Zone, die immer verfügbar ist:

utc : Zone

Menschenlesbare Zeiten

Mit einem Posix und einer Zone haben wir genug Informationen, um die lokale Zeit in beliebigem Detailgrad anzuzeigen. Hier ist eine Liste der Funktionen, die dafür verwendet werden können:

toYear : Zone -> Posix -> Int
toMonth : Zone -> Posix -> Month
toDay : Zone -> Posix -> Int
toWeekday : Zone -> Posix -> Weekday
toHour : Zone -> Posix -> Int
toMinute : Zone -> Posix -> Int
toSecond : Zone -> Posix -> Int
toMillis : Zone -> Posix -> Int

Du hast sicher schon zwei weitere benutzerdefinierte Typen von Time entdeckt:

type Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec
type Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun

Es bleibt den Nutzern überlassen, diese benutzerdefinierten Typen in menschenlesbare Werte umzuwandeln.

Anleitung

Dein japanischer Freund Kuroko ist ein Streamer mit internationaler Reichweite. Kurokos Streaming-Zeitplan ist ziemlich verzwickt, und jeder Stream scheint jeden Tag zu einer anderen Uhrzeit zu beginnen.

Er bittet dich um Hilfe beim Bau einer kleinen Anwendung, die seinen Zeitplan in den lokalen Zeitzonen seiner Zuschauer anzeigt: Kuroko's Clock. Er hat noch eine zusätzliche Anforderung: Die App soll die Uhrzeit in zwei verschiedenen Sprachen anzeigen können: Japanisch und US-Englisch.

1. Ein Date

Definiere eine Funktion showLocalDate : Locale -> Int -> Month -> Int -> String, die ein (gültiges) lokales Datum anzeigt.

In der Locale US wird das Format Month/Day/Year verwendet, ohne führende Nullen.

In der Locale JP wird das Format Year年Month月Day日 verwendet, ebenfalls ohne führende Nullen.

showLocalDate US 2025 May 1
    -- "5/1/2025"
showLocalDate JP 2025 May 1
    -- "2025年5月1日"

2. Showtime

Definiere eine Funktion showLocalTime : Locale -> Int -> Int -> String, die eine (gültige) lokale Uhrzeit anzeigt.

In der Locale US zeigst du die Stunden im 12-Stunden-Format zusammen mit „PM“ oder „AM“ an, und die Minuten mit führenden Nullen.

In der Locale JP zeigst du die Stunde im 24-Stunden-Format vor „時“ an und die Minuten ohne führende Nullen vor „分“.

showLocalTime US 13 8
    -- "1:08 PM"
showLocalTime JP 13 8
    -- "13時8分"

3. Ab in die Zone

Definiere eine Funktion showDateTime : Locale -> Zone -> Posix -> String, die ein Datum und eine Uhrzeit relativ zu einer Zeitzone in einer bestimmten Locale anzeigt.

Verwende showLocalDate und showLocalTime, um das Endergebnis anzuzeigen.

showDateTime US Time.utc (Time.millisToPosix 0)
    -- "1/1/1970 12:00 AM"
showDateTime JP Time.utc (Time.millisToPosix 0)
    -- "1970年1月1日0時0分"
Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab
Elm Exercism

Bereit, mit Kurokos Uhr zu starten?

Melde dich bei Exercism an, um Elm mit 28 Konzepte110 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.