我需要在elixir中将erlang时间戳转换为NaiveDateTime。
NaiveDateTime.from_erl {{2019, 4, 24}, {24, 0, 0}}
{:error, :invalid_time}
NaiveDateTime(以及elixir中的所有其他时间模块)的文档不支持24,因为即使是零时间,它也与ISO8601兼容。
有关如何处理此问题的任何想法?我可以在元组上进行模式匹配,然后将其更改为0,但是我觉得这是一个非常丑陋的解决方案。有什么想法吗?
谢谢
更新 我的解决方案:感谢@Aleksei Matiushkin的调整。
defmodule Helpers do
def naive_date_time({{y, m, d}, {24, 0, 0}}) do
case NaiveDateTime.from_erl({{y, m, d}, {0, 0, 0}}) do
{:ok, naive_dt} -> {:ok, NaiveDateTime.add(naive_dt, 24 * 3_600)}
{:error, reason} -> {:error, reason}
end
end
def naive_date_time(dt), do: NaiveDateTime.from_erl(dt)
end
答案 0 :(得分:2)
文档明确指出了this format is not supported:
ISO 8601允许日期时间将第二天的零时指定为24:00:00,但Elixir不支持此表示法
也就是说,即使在将来,也不应指望这一问题会得到解决。我将使用显式的辅助函数:
defmodule Helpers do
def naive_date_time({{y, m, d}, {24, 0, 0}}),
do: NaiveDateTime.add({{y, m, d}, {0, 0, 0}}, 24 * 3_600)
def naive_date_time(dt), do: NaiveDateTime.from_erl(dt)
end
我在这里看不到任何丑陋之处。请注意,转换{24, 0, 0}
→{0, 0, 0}
时,应该添加一天。
注意!以上解决方案针对格式错误的输入。请参阅原始问题中的更新以获取此修复程序,或以下内容:
defmodule Helpers do
def naive_date_time({{y, m, d}, {24, 0, 0}}) do
{{y, m, d}, {0, 0, 0}}
|> NaiveDateTime.from_erl()
|> naive_date_time_add()
end
def naive_date_time(dt), do: NaiveDateTime.from_erl(dt)
defp naive_date_time_add({:ok, dt}),
do: {:ok, NaiveDateTime.add(dt, 24 * 3_600)}
defp naive_date_time_add(err), do: err
end