Elm:Json 迄今为止的解码器时间戳

Elm: Json decoder timestamp to Date

我正在尝试将时间戳(例如:“1493287973015”)从 JSON 转换为日期类型。

到目前为止,我创建了这个自定义解码器:

stringToDate : Decoder String -> Decoder Date
stringToDate decoder =
  customDecoder decoder Date.fromTime

但它不起作用,因为它有 return 结果,而不是日期:

Function `customDecoder` is expecting the 2nd argument to be:

    Time.Time -> Result String a

But it is:

    Time.Time -> Date.Date

有没有办法进行转换?

假设您的 JSON 实际上将数值放在引号内(意味着您正在解析 JSON 值 "1493287973015" 而不是 1493287973015),您的解码器可能看起来像这样:

import Json.Decode exposing (..)
import Date
import String

stringToDate : Decoder Date.Date
stringToDate =
  string
    |> andThen (\val ->
        case String.toFloat val of
          Err err -> fail err
          Ok ms -> succeed <| Date.fromTime ms)

请注意,stringToDate 没有传递任何参数,这与您试图传递 Decoder String 作为参数的示例相反。这不是解码器的工作方式。

相反,这可以通过构建更原始的解码器来完成,在这种情况下,我们从解码器 string from Json.Decode 开始。

andThen 部分然后采用解码器给出的字符串值,并尝试将其解析为浮点数。如果它是有效的 Float,它被送入 Date.fromTime,否则,它是失败的。

fail and succeed 函数将您正在处理的正常值包装到 Decoder Date.Date 上下文中,以便可以返回它们。

两件事,JSON 实际上可能将毫秒作为整数,而不是字符串,并且自 Elm 的 v 0.19 以来事情已经发生了变化。

鉴于您的 JSON 看起来像。

{
    ...
    "someTime": 1552483995395,
    ...
}

然后这将解码为 Time.Posix:

import Json.Decode as Decode

decodeTime : Decode.Decoder Time.Posix
decodeTime =
    Decode.int
        |> Decode.andThen
            (\ms ->
                Decode.succeed <| Time.millisToPosix ms
            )