2016-10-17 6 views
2

私は外部APIからデータを処理しています。これはタイムゾーンとともにISO 8601形式のタイムスタンプを返します。Ecto.DateTime.cast()の入力フォーマットとしてISO 8601

Ectoバージョン2.1-rc(私のバージョン)は、このようなタイムスタンプを問題なく扱うことができます。しかし、私が実行しようとすると:

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

を私はエラーが表示されます。

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

は私のタイムスタンプが問題ですか?

答えて

2

Ecto.DateTime.castの形式が正しくありません。 itをここにチェックしてください。

この:

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

はエラーをスローしません。

-を使用することはできません。他の有効なISO-8601 datetimeを-記号なしで使用するか、それをスキップするだけです。

+0

あなたは、すべて一緒にだけでなく、ダッシュのタイムゾーンを削除しているように見えました。ここにタイムゾーンを正しく表現する方法はありますか? –

5

あなたのタイムスタンプは有効なISO 8601ですが、Ectoはv2.1.0-rc.2のような日付時刻の解析をサポートしていません。 timexのような他のライブラリを使用してそれらを解析し、UTCに変換してからEctoに格納することができます。

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

エクト2.1を使用すると、:utc_datetimeフィールドに直接この値を格納することができます

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]} 
関連する問題