Phoenix,Json和Unix时间戳

时间:2016-04-27 00:45:22

标签: 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 / Elixir中,将Unix时间戳转换为DateTime对象的最佳方法是什么?我假设因为我要插入Ecto数据库,我需要使用Ecto DateTime对象。

2 个答案:

答案 0 :(得分:2)

你可以从这样的unix时间戳中获得一个Erlang风格的日期时间元组:

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}}

您可以使用Ecto.DateTime

将该元组转换为Ecto.DateTime.from_erl/1

但请检查一下你的假设。也许你需要时区信息。我看到你的例子中有0的值。你真的希望1970-01-01 00:00:00代表"没有价值"?

答案 1 :(得分:1)

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

# Change unit to millisecond, the default is second
timestamps |> DateTime.from_unix(:millisecond)

当你有一个DateTime构造时,你可以将它传递给Ecto models字段。 Ecto支持2种字段类型naive_datetimeutc_datetime,它们对应NaiveDateTimeDateTime结构。您可以选择您想要的,Ecto将为您进行转换。

最后,两个字段类型将转换为数据库中的相同类型,即PostgreSQL中的timestamp without time zone。因此,您可以轻松切换模型架构。