Phoenix、Json和Unix时间戳

Phoenix、Json和Unix时间戳,json,datetime,elixir,phoenix-framework,Json,Datetime,Elixir,Phoenix Framework,我正在以json格式从SQL Server导出数据,以便将其导入到我的Phoenix应用程序中。我不确定的是我该如何处理约会。目前,我正在将日期导出为Unix时间戳。以下是一个示例: [ { "Log": { "Start": 1319734790, "End": 0, "Comment": "" }, { "Log": { "Start": 1319732847, "End": 1319734790, "Comment": "Had lunch today" } ] 在Phoenix

我正在以json格式从SQL Server导出数据,以便将其导入到我的Phoenix应用程序中。我不确定的是我该如何处理约会。目前,我正在将日期导出为Unix时间戳。以下是一个示例:

[
  { "Log": { "Start": 1319734790, "End": 0, "Comment": "" },
  { "Log": { "Start": 1319732847, "End": 1319734790, "Comment": "Had lunch today" }
]

在Phoenix/Elixir中,将Unix时间戳转换为DateTime对象的最佳方式是什么?我假设因为我要插入一个EXTO数据库,所以我需要使用一个EXTO DateTime对象。

您可以从unix时间戳中获得一个Erlang样式的DateTime元组,如下所示:

epoch = :calendar.datetime_to_gregorian_seconds({{1970, 1, 1}, {0, 0, 0}})
datetime = :calendar.gregorian_seconds_to_datetime(your_unix_timestamp + epoch)
这将有元组格式的
datetime
,如
{{2016,4,28},{00:50:12}

您可以使用
exto.DateTime.from\u erl/1


但请检查你的假设。也许你需要时区信息。我看到在你的例子中有值
0
。您真的希望1970-01-01 00:00:00表示“无值”吗?

您可以使用
DateTime.from_unix/2
将unix时间戳转换为DateTime结构,如下所示

# Change unit to millisecond, the default is second
timestamps |> DateTime.from_unix(:millisecond)
当您有一个DateTime构造时,您只需将其传递到“Exto模型”字段。Ecto支持两种字段类型
NaiveDateTime
utc\u datetime
,它们对应于
NaiveDateTime
datetime
结构。你可以选择你想要的,而星外星将为你做转化


最后,这两种字段类型将在数据库中转换为相同的类型,即PostgreSQL中无时区的时间戳。因此,您可以轻松地切换模型模式。

此外,如果您计划大量使用时间,那么使用
Timex
库可能是有意义的,这会使事情变得更简单。最后,因为我可以控制json,所以我使用iso日期格式的字符串。这些字符串会自动转换为DateTime字段,我不需要手动操作conversions@Dogbert你给出的链接不是真的,不是。我要测试0并将其转换为零。在导入功能正常之前,我也一直在保留时区信息,但是是的,时区很重要。我很喜欢这个,它又好又短