我的目标是在几分钟内找出时差:
{_, {_, 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])
如何解决这个问题?
我不愿意使用像时间这样的外部库。
答案 0 :(得分:2)
出于某种原因,您在RDBMS中拥有的DateTime
值缺少时区信息。 Ecto.DateTime
和NaiveDateTime
之间存在一个主要区别:前者关注时区,而后者则不关心(以及标准的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中查找具有天真日期时间值的原因并进行修复。