Elixir零小时时间为24

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elixir零小时时间为24相关的知识,希望对你有一定的参考价值。

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

该文件明确指出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}时,应该添加一天。


NB!上面的解决方案会导致输入错误。有关修复的信息,请参阅原始问题中的更新,或者在下面:

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

以上是关于Elixir零小时时间为24的主要内容,如果未能解决你的问题,请参考以下文章

如何安排代码在 Elixir 或 Phoenix 框架中每隔几个小时运行一次?

[12小时Javascript Clock显示24时间,错误的AM / PM

为抵抗洪水,战士连续作战89小时,编程计算共多少天零多少小时?

如何优化C ++代码的以下片段 - 卷中的零交叉

从零开始学正则

日期12小时 || 24小时制切换