长生不老药的零时时间为24

时间:2019-04-24 16:15:11

标签: erlang elixir

我需要在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

1 个答案:

答案 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