2016-08-12 6 views
3

Ecto.DateTime.utcは現在の日時を返します。Ecto.Datetime get 15分前

15分前にEcto.DateTimeを作成するにはどうすればよいですか?

+1

あなたが直接起動することはできませんが、 ''前 ''(https://hexdocs.pm/ecto/Ecto.Query.API.html#ago/2)があります(これは ' where'句など)。 – evuez

答えて

6

はバックアーランタイムタプルに変換し、* 60 15を引き、:calendarを使用して、グレゴリオ秒に変換し、(エクトはEcto.DateTime.utc/0のためにこれを使用しています):erlang.universaltimeを使用して時刻を取得し、Ecto.DateTimeに戻ってキャスト:

iex(1)> utc = :erlang.universaltime |> :calendar.datetime_to_gregorian_seconds 
63638236105 
iex(2)> fifteen_minutes_ago = (utc - 15 * 60) |> :calendar.gregorian_seconds_to_datetime |> Ecto.DateTime.cast! 
#Ecto.DateTime<2016-08-12 15:33:25> 

編集:パイプラインはここによく見えるかもしれません:

:erlang.universaltime 
|> :calendar.datetime_to_gregorian_seconds 
|> Kernel.-(15 * 60) 
|> :calendar.gregorian_seconds_to_datetime 
|> Ecto.DateTime.cast! 
|> IO.inspect 

同じ出力前と同じように。

+0

これは動作しています、ありがとう!しかし、ちょっと長い機能チェーンです。より短い実装を待っていますか? P.S.私はtimexが作成されたことに驚いていない;) – asiniy

+0

しかし、それは長いですが、私は別のライブラリを使用することなく、より短い解決策はないと思います。もう少し見えるパイプチェーンのソリューションを追加しました。誰かがもっと短い解決策を掲示すれば素晴らしいだろう! – Dogbert

+0

他のオプションはありません... – asiniy

関連する問題