Rob*_*ell 5 timezone datetime utc elm
在 Elm 中有没有办法在不使用端口的情况下将本地时间(例如 string 2019-03-18T09:10:12.4
;没有指定偏移量)和时区(例如Australia/Sydney
)转换为可能的Posix值(即,该时间转换为 UTC)?
有waratuman/time-extra,但它似乎只适用于 Date 部分。遗憾的是rtfeldman/elm-iso8601-date-strings不使用timezones。
在 JS 中,有诸如moment-tz和date-fns-timezone之类的选项,但是避免 JS 互操作以进行频繁的日期解析会简单得多。
通过结合justinmimbs/time-extra和justinmimbs/timezone-data,您应该能够完全在 Elm 中获得有效的 posix 。
演示:https://ellie-app.com/54tyw9yvsQga1
首先,您需要将您的转换timestampWithoutTimezone
为Parts
:
toParts : String -> Maybe Parts
toParts timestampWithoutTimezone =
timestampWithoutTimezone
|> Regex.find regex
|> List.map .submatches
|> List.head
|> Maybe.andThen Maybe.Extra.combine
|> Maybe.andThen listToParts
regex : Regex
regex =
Maybe.withDefault Regex.never <|
Regex.fromString "^(\\d{4})-(\\d{2})-(\\d{2})T(\\d{2}):(\\d{2}):(\\d{2})\\.(\\d)$"
monthLookup : Dict String Month
monthLookup =
Dict.fromList [ ( "01", Jan ), ( "02", Feb ), ( "03", Mar ), ( "04", Apr ), ( "05", May ), ( "06", Jun ), ( "07", Jul ), ( "08", Aug ), ( "09", Sep ), ( "10", Oct ), ( "11", Nov ), ( "12", Dec ) ]
listToParts : List String -> Maybe Parts
listToParts list =
let
toInt : Int -> Maybe Int
toInt index =
list |> List.Extra.getAt index |> Maybe.andThen String.toInt
in
Maybe.map2 Parts
(toInt 0)
(list |> List.Extra.getAt 1 |> Maybe.andThen (\month -> Dict.get month monthLookup))
|> Maybe.andThen (\parts -> Maybe.map5 parts (toInt 2) (toInt 3) (toInt 4) (toInt 5) (toInt 6))
Run Code Online (Sandbox Code Playgroud)
然后,使用partsToPosix
适当的Zone
你可以得到一个 posix 值:
toPosix : Time.Zone -> String -> Maybe Posix
toPosix zone timestampWithoutTimezone =
timestampWithoutTimezone
|> toParts
|> Maybe.map (Time.Extra.partsToPosix zone)
Run Code Online (Sandbox Code Playgroud)
库作者建议您将评估的区域值存储在模型中:
model = { zone = TimeZone.australia__sydney () }
toPosix model.zone "2019-03-18T09:10:12.4"
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
306 次 |
最近记录: |