【问题标题】:Phoenix, Json and Unix TimestampsPhoenix、Json 和 Unix 时间戳
【发布时间】:2017-02-13 11:17:59
【问题描述】:

我正在以 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 对象。

【问题讨论】:

  • 另外,如果您打算花很多时间工作,使用Timex 库可能很有意义,这会让事情变得更容易。
  • 最后,因为我对json有控制权,所以我使用了iso日期格式的字符串。这些字符串会自动转换为 DateTime 字段,我无需进行任何手动转换
  • @Dogbert 你给的链接是404

标签: json datetime elixir phoenix-framework


【解决方案1】:

您可以像这样从 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.from_erl/1 将该元组转换为Ecto.DateTime

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

【讨论】:

  • 不是,不是。我要测试 0 并将其转换为 nil。在导入功能正常之前,我还保留了时区信息,但是是的,时区很重要。
【解决方案2】:

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

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

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

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

【讨论】:

  • 我很喜欢这个,又好又短
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2011-12-10
  • 1970-01-01
  • 2013-03-23
  • 2021-02-12
  • 1970-01-01
  • 2016-10-11
相关资源
最近更新 更多