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.
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
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
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.
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.
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日"
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分"
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分"
Melde dich bei Exercism an, um Elm mit 28 Konzepte110 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.