【问题标题】:ISO 8601 as input format for Ecto.DateTime.cast()ISO 8601 作为 Ecto.DateTime.cast() 的输入格式
【发布时间】:2016-10-17 01:25:42
【问题描述】:

我正在处理来自外部 API 的数据。它以 ISO 8601 格式返回时间戳,带时区。

我的理解是 Ecto 版本 2.1-rc(我的版本)可以毫无问题地处理此类时间戳。但是,当我尝试执行时:

created_at = Ecto.DateTime.cast!("2016-10-16T21:21:27-04:00")

我收到一个错误:

(Ecto.CastError) cannot cast "2016-10-16T21:21:27-04:00" to datetime

我的时间戳有问题吗?

【问题讨论】:

    标签: timestamp elixir ecto


    【解决方案1】:

    您的时间戳是有效的 ISO 8601,但 Ecto 不支持解析 v2.1.0-rc.2 之后的日期时间。您可以使用timex 等其他库来解析它们,转换为UTC,然后将它们存储在Ecto 中。

    iex(1)> "2016-10-16T21:21:27-04:00" |> Timex.parse!("{ISO:Extended}")
    #<DateTime(2016-10-16T21:21:27-04:00 Etc/GMT+4)>
    iex(2)> "2016-10-16T21:21:27-04:00" |> Timex.parse!("{ISO:Extended}") |> Timex.to_datetime
    #<DateTime(2016-10-17T01:21:27Z Etc/UTC)>
    

    使用 Ecto 2.1,您可以将此值直接存储在 :utc_datetime 字段中:

    iex(1)> created_at = "2016-10-16T21:21:27-04:00" |> Timex.parse!("{ISO:Extended}") |> Timex.to_datetime
    #<DateTime(2016-10-17T01:21:27Z Etc/UTC)>
    iex(2)> Repo.insert!(%Person{created_at: created_at})
    12:58:39.959 [debug] QUERY OK db=2.5ms
    INSERT INTO "people" ("created_at","inserted_at","updated_at") VALUES ($1,$2,$3) RETURNING "id" [{{2016, 10, 17}, {1, 21, 27, 0}}, {{2016, 10, 17}, {7, 28, 39, 945106}}, {{2016, 10, 17}, {7, 28, 39, 948505}}]
    %Friends.Person{__meta__: #Ecto.Schema.Metadata<:loaded, "people">, age: nil,
     created_at: #<DateTime(2016-10-17T01:21:27Z Etc/UTC)>, first_name: nil, id: 1,
     inserted_at: ~N[2016-10-17 07:28:39.945106], last_name: nil,
     updated_at: ~N[2016-10-17 07:28:39.948505]}
    

    【讨论】:

      【解决方案2】:

      Ecto.DateTime.cast 的格式不正确。请在此处查看it

      这个:

      created_at = Ecto.DateTime.cast!("2016-10-16T21:21:27")
      

      不会抛出错误。

      那里禁止使用-。现在,您可以使用其他没有 - 符号的有效 ISO-8601 日期时间,或者直接跳过它。

      【讨论】:

      • 您似乎已经一起删除了时区,而不仅仅是破折号。有什么方法可以在这里正确表示时区吗?
      猜你喜欢
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      相关资源
      最近更新 更多