榆树:Json解码器时间戳到日期

问题描述 投票:10回答:2

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

到目前为止,我创建了这个定制解码

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

有没有办法进行转换?

elm
2个回答
17
投票

假设您的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上下文中,以便返回它们。


2
投票

两件事,一个JSON实际上可能有毫秒作为整数,而不是一个字符串,并且自从Elm的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
            )
© www.soinside.com 2019 - 2024. All rights reserved.