考虑到IANA时区和当地时间,将其解析为也许是Posix



是否有一种方法可以在当地时间(例如字符串 2019-03-18T09:10:12.4; > no offset指定)和一个时区(例如 Australia/Sydney)可能的POSIX值(即,将时间转换为UTC),而无需使用端口?


有Waratuman/Time-Extra,但似乎仅在日期部分工作。可悲的是,rtfeldman/erm-iso8601-date-string不需要时区。

在JS中,有一些选项,例如Moment-TZ和Date-FNS时区,但是避免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))

然后,使用适当的Zone使用partsToPosix您可以获得POSIX值:

toPosix : Time.Zone -> String -> Maybe Posix
toPosix zone timestampWithoutTimezone =
    timestampWithoutTimezone
        |> toParts
        |> Maybe.map (Time.Extra.partsToPosix zone)

图书馆作者建议您在模型中存储评估的区域值:

model = { zone = TimeZone.australia__sydney () }
toPosix model.zone "2019-03-18T09:10:12.4"

如果我们可以假设您的所有日期都没有时区,并且您始终想在将它们转换为posix之前将它们施加到 Australia/Sydney,那么您应该能够使偏移构成偏移自己创建2019-03-18T09:10:12.4+11:00

toPosix : String -> String -> Maybe Posix
toPosix timezone timestampWithoutTimezone =
    let
        timestampWithTimezone = timestampWithoutTimezone ++ timezone
    in
        timestampWithTimezone |> toTime |> Result.toMaybe

{- If you always want to use Australia/Sydney -}
localPosix =
    toPosix "+11:00"
posix =
    localPosix "2019-03-18T09:10:12.4"
{- Custom timezone -}
posix =
    toPosix "+11:00" "2019-03-18T09:10:12.4"

相关内容

  • 没有找到相关文章

最新更新