凤凰/外生 - 转换ISO串入utc_datetime原始类型(Phoenix/Ecto - con

2019-09-28 01:40发布

在我的凤凰的应用程序,我试图插入一个事件记录到具有字段的数据库start_timeend_time - datetime数据将已被转换到客户端上的ISO字符串格式,并传递到凤凰API的JSON数据,但这是导致我一些麻烦时,我尽量让插入-模型期待这些值是: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"})

正如预期的那样,这将引发我的datetime数据错误does not match type :utc_datetime 。 好吧,这很酷,但我的问题是,随着数据已经在ISO字符串,我怎样才能将其转换为药剂/外生将其确认为有效:utc_datetime

Answer 1:

你想要一个DateTime为你的结构:utc_datetime场,你可以在文档在这里看到: https://hexdocs.pm/ecto/Ecto.Schema.html#module-primitive-types

你可以得到一个DateTime从ISO字符串一样,你上面有这样的:

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

(在元组零是UTC偏差)

注:支持药剂日历类型的外生2.1中引入的。 DateTime.from_iso8601/1中药剂1.4中引入的。



文章来源: Phoenix/Ecto - converting ISO string into utc_datetime primitive type