无法再转换Ecto.DateTime.to_erl

时间:2017-02-18 06:02:00

标签: elixir phoenix-framework ecto

我的目标是在几分钟内找出时差:

 {_, {_, aaa, _}} = Ecto.DateTime.to_erl(d1) |> :calendar.time_difference(:calendar.universal_time)

我有一个从Postgresql中检索的时间戳:

iex(13)> d1
~N[2017-02-09 07:23:04.000000]

以前这很有效:

d11 = Ecto.DateTime.to_erl(d1)

但是现在它引发了一个例外:

* (FunctionClauseError) no function clause matching in Ecto.DateTime.to_erl/1
    (ecto) lib/ecto/date_time.ex:608: Ecto.DateTime.to_erl(~N[2017-02-09 07:23:04.000000])

如何解决这个问题?

我不愿意使用像时间这样的外部库。

1 个答案:

答案 0 :(得分:2)

出于某种原因,您在RDBMS中拥有的DateTime值缺少时区信息。 Ecto.DateTimeNaiveDateTime之间存在一个主要区别:前者关注时区,而后者则不关心(以及标准的erlang日期时间。)

iex(1)> d1 = ~N[2017-02-09 07:23:04.000000]
~N[2017-02-09 07:23:04.000000]
iex(2)> NaiveDateTime.to_erl d1
{{2017, 2, 9}, {7, 23, 4}}

从上面的代码段可以看出,NaiveDateTime.to_erl/1仍然可以进行转换。

核心解决方案是在RDBMS中查找具有天真日期时间值的原因并进行修复。