Elixir/Phoenix中2个DateTime小时数之间的差异

Koo*_*odi 5 datetime elixir

我的目标是找到从现在到一些提供的date_time之间的小时差异.我试着这样做:

pry(1)> dt1
#DateTime<2017-10-24 05:12:46.000000Z>

pry(2)> Ecto.DateTime.to_erl(dt1)
** (FunctionClauseError) no function clause matching in Ecto.DateTime.to_erl/1    

    The following arguments were given to Ecto.DateTime.to_erl/1:

        # 1
        #DateTime<2017-10-24 05:12:46.000000Z>

    Attempted function clauses (showing 1 out of 1):

        def to_erl(%Ecto.DateTime{year: year, month: month, day: day, hour: hour, min: min, sec: sec})

    (ecto) lib/ecto/date_time.ex:608: Ecto.DateTime.to_erl/1
    # ............
Run Code Online (Sandbox Code Playgroud)

如何解决?或者有更好的方法来实现我的目标吗?

请注意,我不使用timex,也不会使用它,也不会使用任何第三方库.只有内置于Elixir/Erlang/Phoenix的内置.

Pfi*_*itz 9

你可以使用DateTime.diff/3:

iex> dt1 = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "AMT",
...>                 hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...>                 utc_offset: -14400, std_offset: 0, time_zone: "America/Manaus"}
iex> dt2 = %DateTime{year: 2000, month: 2, day: 29, zone_abbr: "CET",
...>                 hour: 23, minute: 0, second: 7, microsecond: {0, 0},
...>                 utc_offset: 3600, std_offset: 0, time_zone: "Europe/Warsaw"}
iex> DateTime.diff(dt1, dt2)
18000
iex> DateTime.diff(dt2, dt1)
-18000
Run Code Online (Sandbox Code Playgroud)

由于DateTime.diff/3返回秒数,您必须计算结果的小时数,如下所示:

result_in_hours = result_in_seconds/(60*60)
Run Code Online (Sandbox Code Playgroud)

  • 您现在可以执行`DateTime.diff(dt1,dt2,:hours)``` (2认同)

Koc*_*ber 6

在主题作者编辑他的问题并从范围中排除外部库之前添加了此答案。然而,我不会删除它,因为我发现 Timex 非常有用,也许有人也会有兴趣使用它(我与 Timex 创建者没有任何关系)

我强烈推荐使用Timex库。它非常适合不同格式和时区的日期/时间计算。因此,在您的情况下,要轻松计算小时差,您只需要:

Timex.diff(dt1, DateTime.utc_now, :hours)
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到 diff/3 文档。