如何在 Elixir 中将字符串转换为 Ecto.DateTime?

How to convert a String into an Ecto.DateTime in Elixir?

我需要将包含有效 UTC 时间的字符串转换为 Ecto.DateTime 时间,稍后我将以正确的格式将其插入到我的数据库中。我试过使用 Ecto.DateTime.cast(date) 方法,但它似乎不起作用。字符串是 Sat Aug 04 11:48:27 +0000 2012 并且来自 Twitter API.

我知道有像 Timex 这样的库我还没有检查过。 Elixir 中是否已经内置了任何简单的工作解决方案?

Elixir 或 Erlang 中没有内置解决方案 来解析这种格式的 DateTime 值:

Sat Aug 04 11:48:27 +0000 2012

您当然可以自己编写一个解析器,但它既不短也不简单。您必须拆分字符串,获取日期和时间参数的值,将月份字符串转换为月份整数,解析时区,以 Elixir/Erlang DateTime 格式表示完整值,然后最终将其转换为 Ecto.DateTime。请参阅以下链接:


这里使用Timex是最好的选择。

这是一个写得很好的库,可以让你远离 Date/Time 内部工作的混乱。使用 Timex,您可以像这样解析您的字符串:

"Sat Aug 04 11:48:27 +0000 2012"
|> Timex.parse!("%a %b %d %T %z %Y", :strftime)
|> Ecto.DateTime.cast!

# => #Ecto.DateTime<2012-08-04 11:48:27>

注意:Timex 内置支持许多常见的 DateTime 格式,我发现不支持 Twitter 发送的 DateTime 格式很奇怪 -所以我写了一个给你。也许仔细检查一下你的字符串是否正确?另请查看 Timex Parsing and Formatting 文档。