Time模組用來顯示人類可讀的日期與時間。
雖然技術上確實可以用Time來操作時間,但 Elm 社群有一些更適合這項任務的套件,例如 justinmimbs/date或CoderDennis/elm-time-format。
時間由不透明型別Posix表示,它包裝了 Unix 紀元時間,也就是自 1970 年 1 月 1 日午夜 UTC 起經過的毫秒數。
Posix是不會因時區而異、不具歧義的值,因此很適合用來記錄時間。
在 Elm 應用程式中,Posix時間通常由外部來源提供,例如瀏覽器。
可以透過下列函式把Posix轉換成毫秒數,反之亦然:
posixToMillis : Posix -> Int
millisToPosix : Int -> Posix
在日常生活中,我們人類通常不會直接讀取Posix,而是偏好本地時間,這取決於我們在地球上的位置,以及當地的日光節約時間規則。
在 Elm 中,這些資訊會編碼在不透明型別Zone中,通常由瀏覽器提供。
有一個永遠都能存取的特殊Zone:
utc : Zone
有了Posix和Zone,我們就有足夠的資訊,用任何詳細程度來顯示本地時間。
以下是可以達成這件事的函式清單:
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
你應該已經注意到另外兩個Time自訂型別:
type Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec
type Weekday = Mon | Tue | Wed | Thu | Fri | Sat | Sun
把這些自訂型別轉換成人類可讀的值,就交給使用者自行處理。
你的日本朋友 Kuroko 是一位在國際上很受歡迎的實況主。 Kuroko 的直播行程相當複雜,每天的直播似乎都在不同的時間開始。
他請你幫忙做一個小型應用程式,用來依照觀眾所在地的時區顯示他的行程:Kuroko's Clock。 他還有一個額外的要求:這個應用程式要能用兩種不同的語言顯示時間:日文和美國英文。
定義一個函式 showLocalDate : Locale -> Int -> Month -> Int -> String,用來顯示(有效的)當地日期。
在 US 地區設定中,格式為 Month/Day/Year,不補前導零。
在 JP 地區設定中,格式為 Year年Month月Day日,同樣不補前導零。
showLocalDate US 2025 May 1
-- "5/1/2025"
showLocalDate JP 2025 May 1
-- "2025年5月1日"
定義一個函式 showLocalTime : Locale -> Int -> Int -> String,用來顯示(有效的)當地時間。
在 US 地區設定中,小時會以 12 小時制顯示,並加上「PM」或「AM」,分鐘則會補前導零。
在 JP 地區設定中,小時會以 24 小時制顯示在「時」之前,分鐘則不補前導零,顯示在「分」之前。
showLocalTime US 13 8
-- "1:08 PM"
showLocalTime JP 13 8
-- "13時8分"
定義一個函式 showDateTime : Locale -> Zone -> Posix -> String,用來依照特定地區設定,顯示相對於某個時區的日期和時間。
使用 showLocalDate 和 showLocalTime 來顯示最終結果。
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分"