Elixir 无法再将exto.DateTime.to_erl转换为
我的目标是找出以分钟为单位的时差:Elixir 无法再将exto.DateTime.to_erl转换为,elixir,phoenix-framework,ecto,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) 但现在它抛出了一个异常:
{_, {_, 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])
如何解决这个问题
我不愿意使用诸如times之类的外部库。出于某种原因,RDBMS中的
DateTime
值缺少时区信息。和之间有一个主要区别:前者关心时区,后者不关心(以及标准的erlang datetime)
从上面的代码片段中,您可能会看到,转换仍然可以进行
核心解决方案是找到RDBMS中具有naỉve datetime值的原因并修复它。由于某些原因,RDBMS中的
datetime
值缺少时区信息。和之间有一个主要区别:前者关心时区,后者不关心(以及标准的erlang datetime)
从上面的代码片段中,您可能会看到,转换仍然可以进行
核心解决方案是找到RDBMS中具有naỉve datetime值的原因并修复它。我不知道,但现在它以原始格式返回它。就我而言,RDBMS不生成值,它返回的正是存储的内容。这就是说,在应用程序的某个地方,您在那里存储了一个naỉve值。我强烈建议您找出原因,否则从长远来看,您肯定会遇到问题。以前,它在数据库中不使用毫秒来保存datetime,现在,在昏迷后的“秒”部分使用-6位数字。你知道为什么吗?我知道毫秒是什么,不,我不是算命的。您应该检查操作数据和执行写操作的代码。postgresql本身不存储时区信息,是吗?它只以utc格式存储所有时间戳。我不知道,但现在它以朴素的格式返回。就我而言,RDBMS不生成值,它只返回存储的内容。这就是说,在应用程序的某个地方,您在那里存储了一个naỉve值。我强烈建议您找出原因,否则从长远来看,您肯定会遇到问题。以前,它在数据库中不使用毫秒来保存datetime,现在,在昏迷后的“秒”部分使用-6位数字。你知道为什么吗?我知道毫秒是什么,不,我不是算命的。您应该检查操作数据和执行写操作的代码。postgresql本身不存储时区信息,是吗?它仅以utc格式存储所有时间戳。
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}}