學習軌道
/
Elm
Elm
/
練習
/
Kuroko 的時鐘
Kuroko 的時鐘

Kuroko 的時鐘

學習練習

簡介

時間

Time模組用來顯示人類可讀的日期與時間。 雖然技術上確實可以用Time來操作時間,但 Elm 社群有一些更適合這項任務的套件,例如 justinmimbs/date或CoderDennis/elm-time-format。

Posix

時間由不透明型別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。 他還有一個額外的要求:這個應用程式要能用兩種不同的語言顯示時間:日文和美國英文。

1. 來談談日期

定義一個函式 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日"

2. 開播時間到了

定義一個函式 showLocalTime : Locale -> Int -> Int -> String,用來顯示(有效的)當地時間。

在 US 地區設定中,小時會以 12 小時制顯示,並加上「PM」或「AM」,分鐘則會補前導零。

在 JP 地區設定中,小時會以 24 小時制顯示在「時」之前,分鐘則不補前導零,顯示在「分」之前。

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

3. 進入時區

定義一個函式 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分"
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Elm Exercism

準備好開始 Kuroko 的時鐘 了嗎?

註冊 Exercism,透過 28 個概念110 個練習 和真人引導來學習並精通 Elm,全部免費。