gpt4 book ai didi

timestamp - ISO 8601 作为 Ecto.DateTime.cast() 的输入格式

转载 作者:行者123 更新时间:2023-12-04 16:31:03 25 4
gpt4 key购买 nike

我正在处理来自外部 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

我的时间戳有问题吗?

最佳答案

您的时间戳是有效的 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]}

关于timestamp - ISO 8601 作为 Ecto.DateTime.cast() 的输入格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40077283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com