2017-02-18 116 views
0

我的目標是找到分鐘的時間差:不再能夠轉換Ecto.DateTime.to_erl

{_, {_, 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]) 

如何解決這個問題?

我不願意使用外部庫,如時間。

回答

2

由於某些原因,RDBMS中的DateTime值缺少時區信息。有Ecto.DateTimeNaiveDateTime之間的主要區別是:關於時區前的憂慮,而後者不

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中具有天真的日期時間值並解決它的原因。

+0

我不知道,但現在它以Naive格式返回它。 – Kevin

+0

就我而言,RDBMS不會產生**值,它會返回所存儲的內容。也就是說,在應用程序的某個地方,你存儲了一個天真的價值。我強烈建議你找出原因,否則你長期以來肯定會遇到這個問題。 – mudasobwa

+0

以前它將datetime保存在數據庫中,毫秒毫秒,現在使用 - 「秒」部分中的昏迷後有6位數字。你有什麼想法爲什麼? – Kevin

相關問題