我正在撰寫一個由 ELM 撰寫的日歷,它需要顯示它通過 REST 介面從后端獲取的條目。我從后端獲得的所有時間都是 UTC,我需要將它們顯示給用戶所在時區的用戶。
我通過在開始時使用以下任務從用戶中取出時區來實作這一點:
getTimezone : Cmd Msg
getTimezone =
Task.perform SetTimezone here
并將結果存盤在模型中。
每當我需要向用戶顯示時間戳時,我都會使用這兩個函式:
formatTime : Zone -> Posix -> String
formatTime zone timestamp =
let
hour =
toHour zone timestamp
minute =
toMinute zone timestamp
in
(padLeft 2 '0' <| fromInt hour) ":" (padLeft 2 '0' <| fromInt minute)
formatTimeOfIsoTimestamp : Zone -> String -> String
formatTimeOfIsoTimestamp zone isoTimestamp =
toTime isoTimestamp |> Result.map (formatTime zone) |> Result.withDefault isoTimestamp
既然我們上周結束在歐洲從夏令時切換到標準時間,我注意到一個問題:
上周(仍然有 DST)本周內的所有時間都關閉一小時,因為我的代碼仍在向時間戳添加兩個小時(CEST 偏移),而只添加一小時(CET 偏移)是正確的。本周正好相反:本周和接下來幾周的時間戳是正確的,而過去幾周的時間戳現在都是不正確的。
我在https://package.elm-lang.org/packages/elm/time/latest/Time#here中看到了注釋,這可能是我遇到的問題:here不回傳時區Europe/Berlin資訊,而是一個固定的偏移量,就我而言,Etc/GMT 1或者Etc/GMT 2取決于 DST 目前是否處于活動狀態。
我現在的問題是:如果我需要格式化全年分布的時間戳,我該如何正確處理 ELM 中的時區?有沒有其他軟體包可以幫助我解決這個問題?如果需要,我還可以向服務器詢問用戶的正確時區(例如Europe/Berlin),但我不想為出于性能原因需要轉換的每個時間戳發出服務器請求。所以我想我需要在 ELM 中實作 IANA 時區資料庫。
uj5u.com熱心網友回復:
而不是使用提供的固定偏移量,Time.here另一種方法是在啟動時通過標志傳遞Intl.DateTimeFormat().resolvedOptions().timeZone(MDN)的結果。
使用justinmimbs/timezone-data,在 Elm 端決議它可能看起來像:
TimeZone.zones
|> Dict.get resolvedTimeZone
|> Maybe.withDefault TimeZone.zone_australia__sydney
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/351676.html
