Phoenix / Ecto - 将ISO字符串转换为utc_datetime基本类型

时间:2017-09-28 19:44:41

标签: datetime elixir phoenix-framework ecto

在我的Phoenix应用程序中,我尝试将事件记录插入到包含start_timeend_time字段的数据库中 - 日期时间数据已经转换为ISO字符串格式客户端并作为JSON数据传递给Phoenix API,但是当我尝试进行插入时这会给我带来一些麻烦 - 模型期望这些值为:utc_datetime所以我需要转换它们 - 我通读了文档,但我还不确定......

首先,这里是模型的架构:

@primary_key {:id, :string, []}
@derive {Phoenix.Param, key: :id}
schema "calendar_event" do
  field :start_time, :utc_datetime
  field :end_time, :utc_datetime
  field :description, :string

  timestamps()
end

来自客户端的JSON数据如下所示:

{
    "start_time": "2017-09-28T18:31:32.223Z",
    "end_time": "2017-09-28T19:31:32.223Z",
    "description": "Test insert"
}

如果我(不正确)尝试按原样插入此数据,该语句将如下所示:

MyApp.Repo.insert(%MyApp.CalendarEvent{id: "calendar_event:test1", start_time: 
"2017-09-28T18:31:32.223Z", end_time: "2017-09-28T19:31:32.223Z", 
description: "Test insert"})

正如预期的那样,这会引发我的日期时间数据does not match type :utc_datetime的错误。好的,这很酷,但我的问题是,如果数据已经在ISO字符串中,我该如何将其转换为Elixir / Ecto将其识别为有效:utc_datetime

1 个答案:

答案 0 :(得分:3)

您想要DateTime字段的:utc_datetime结构,正如您在此处的文档中所见:https://hexdocs.pm/ecto/Ecto.Schema.html#module-primitive-types

你可以从像上面那样的iso字符串中获得DateTime

iex> {:ok, dt, 0} = DateTime.from_iso8601("2017-09-28T18:31:32.223Z")
iex> dt
#DateTime<2017-09-28 18:31:32.223Z>

(元组中的零是UTC偏移量)

注意:在Ecto 2.1中引入了对Elixir Calendar类型的支持。 Elixir 1.4中引入了DateTime.from_iso8601/1