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