在Phoenix JSON API中接受日期

Fre*_*rik 3 json elixir phoenix-framework

在菲尼克斯,我有这个模型

schema "events" do
  field :start_time, Ecto.DateTime
  field :end_time, Ecto.DateTime
  belongs_to :calendar, Weozo.Calendar

  timestamps
end

@required_fields ~w(calendar_id start_time end_time)
@optional_fields ~w()

def changeset(model, params \\ :empty) do
  model
  |> cast(params, @required_fields, @optional_fields)
end
Run Code Online (Sandbox Code Playgroud)

我有一个由scaffold生成的JSON API控制器(通过:api),其中create函数看起来像这样

  def create(conn, %{"event" => event_params}) do
    changeset = Event.changeset(%Event{}, event_params)

    case Repo.insert(changeset) do
      {:ok, event} ->
        conn
        |> put_status(:created)
        |> put_resp_header("location", event_path(conn, :show, event))
        |> render("show.json", event: event)
      {:error, changeset} ->
        conn
        |> put_status(:unprocessable_entity)
        |> render(Weozo.ChangesetView, "error.json", changeset: changeset)
    end
  end
Run Code Online (Sandbox Code Playgroud)

这只是默认的锅炉板.现在,我想用Javascript客户端创建一个事件,使用jQuery我这样做:

$.post('/api/events', 
  {"event": {"calendar_id": 1, "start_time": Date.now(), "end_time": Date.now()}}
).always(function(r){console.log(r.responseText)})
Run Code Online (Sandbox Code Playgroud)

它会返回这个

{"errors":{"start_time":["is invalid"],"end_time":["is invalid"]}}
Run Code Online (Sandbox Code Playgroud)

因此,默认情况下,Javascript将日期作为整数(Epoch格式)发布.我已经尝试过curl的一系列变化,如下所示:

只是一个正常的约会

curl -X POST http://localhost:4000/api/events \
  -H "Content-Type: application/json" \
  -d '{"event": {"calendar_id": 1, "start_time": "2015-10-29", "end_time": "2015-10-29"}}'
Run Code Online (Sandbox Code Playgroud)

RFC 1123格式化日期

curl -X POST http://localhost:4000/api/events \
  -H "Content-Type: application/json"
  -d '{"event":{"calendar_id":"1","start_time":"Thu, 29 Oct 2015 20:11:54 GMT","end_time":"Thu, 29 Oct 2015 20:11:54 GMT"}}'
Run Code Online (Sandbox Code Playgroud)

ISO 8601格式化日期

curl -X POST http://localhost:4000/api/events \
  -H "Content-Type: application/json"
  -d '{"event":{"calendar_id":"1","start_time":"2015-10-29T20:12:30+0000","end_time":"2015-10-29T20:12:30+0000"}}'
Run Code Online (Sandbox Code Playgroud)

它们都收到相同的"无效"错误消息.

所以Phoenix不接受Epoch,RFC 1123或ISO 8601.我应该如何设置Phoenix的日期以接受它?

Gaz*_*ler 10

变更集将使用文档中的Ecto.DateTime.cast/1转换日期时间字段:

•"YYYY-MM-DD HH:MM:DD"格式的二进制文件(可以用T和/或后跟"Z"分隔,如2014-04-17T14:00:00Z)

•"YYYY-MM-DD HH:MM:DD.USEC"格式的二进制文件(可以用T和/或后跟"Z"分隔,如2014-04-17T14:00:00.030Z)

时间应采用ISO8601格式:

2015-10-29T20:12:30Z
Run Code Online (Sandbox Code Playgroud)

您可以在JavaScript中生成这样的字符串:

new Date().toISOString()
Run Code Online (Sandbox Code Playgroud)