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

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

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


但这不起作用,因为它返回的是结果,而不是日期:

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,否则将失败。

failsucceed函数将您要处理的普通值包装到Decoder Date.Date上下文中,以便可以将其返回。

10-06 04:02