2016-10-17 2 views
2

Ich verarbeite Daten von einer externen API. Es gibt Zeitstempel als ISO 8601-Format mit Zeitzone zurück.ISO 8601 als Eingabeformat für Ecto.DateTime.cast()

Mein Verständnis ist, dass Ecto Version 2.1-rc (meine Version) solche Zeitstempel ohne Problem behandeln kann. Allerdings, wenn ich versuche, auszuführen:

created_at = Ecto.DateTime.cast!("2016-10-16T21:21:27-04:00") 

Ich erhalte eine Fehlermeldung:

(Ecto.CastError) cannot cast "2016-10-16T21:21:27-04:00" to datetime 

Gibt es ein Problem mit meinem Zeitstempel?

Antwort

2

Ihr Format ist nicht korrekt für Ecto.DateTime.cast. Bitte überprüfen Sie it hier.

Dies:

created_at = Ecto.DateTime.cast!("2016-10-16T21:21:27") 

nicht den Fehler werfen.

Verwendung von - ist dort verboten. Jetzt liegt es an Ihnen, andere gültige ISO-8601 Datetime ohne - Zeichen zu verwenden oder einfach zu überspringen.

+0

Sie schienen alle zusammen die Zeitzone entfernt zu haben, nicht nur den Strich. Gibt es eine Möglichkeit, die Zeitzone hier korrekt darzustellen? –

5

Ihr Zeitstempel ist gültig für ISO 8601, aber Ecto unterstützt das Parsen solcher Datumsangaben ab v2.1.0-rc.2 nicht. Sie können andere Bibliotheken wie timex verwenden, um sie zu analysieren, in UTC zu konvertieren und sie dann in Ecto zu speichern.

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)> 

Mit Ecto 2.1, können Sie diesen Wert speichern direkt in einem :utc_datetime Feld:

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]}