花时间使用:erlang.universaltime(Ecto使用它Ecto.DateTime.utc/0),使用转换为格里高利秒:calendar,减去15*60,转换回Erlang时间元组,并转换回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>
Run Code Online (Sandbox Code Playgroud)
编辑:管道可能看起来更好:
:erlang.universaltime
|> :calendar.datetime_to_gregorian_seconds
|> Kernel.-(15 * 60)
|> :calendar.gregorian_seconds_to_datetime
|> Ecto.DateTime.cast!
|> IO.inspect
Run Code Online (Sandbox Code Playgroud)
与以前相同的输出.