Datetime Phoenix/Exto-将ISO字符串转换为utc_日期时间基本类型

Datetime Phoenix/Exto-将ISO字符串转换为utc_日期时间基本类型,datetime,elixir,phoenix-framework,ecto,Datetime,Elixir,Phoenix Framework,Ecto,在我的Phoenix应用程序中,我试图将事件记录插入数据库,该数据库包含start\u time和end\u time字段-datetime数据将在客户端上转换为ISO字符串格式,并作为JSON数据传递给Phoenix API,但是当我尝试进行插入时,这给我带来了一些麻烦-模型希望这些值是:utc_datetime,因此我需要转换它们-我阅读了文档,但我仍然不确定 首先,这里是模型的模式: @primary_key {:id, :string, []} @derive {Phoenix.Para

在我的Phoenix应用程序中,我试图将事件记录插入数据库,该数据库包含
start\u time
end\u time
字段-datetime数据将在客户端上转换为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"})
如果我(错误地)尝试按原样插入此数据,则语句如下所示:

{
    "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"})

正如所料,这会引发一个错误,即我的日期时间数据
与类型:utc_datetime
不匹配。好的,这很酷,但我的问题是,既然数据已经是ISO字符串,我如何将其转换为Elixir/Ecto识别为有效的
:utc\u datetime

您想要为
:utc\u datetime
字段创建一个
datetime
结构,如您在这里的文档中所见:

您可以从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>
iex>{:ok,dt,0}=DateTime.from_iso8601(“2017-09-28818:31:32.223Z”)
iex>dt
#日期时间
(元组中的零是UTC偏移量)

注意:对Elixir日历类型的支持是在Ecto 2.1中引入的<代码>日期时间。从_iso8601/1开始在Elixir 1.4中引入