Эликсир ноль час как 24 - PullRequest
       18

Эликсир ноль час как 24

1 голос
/ 24 апреля 2019

Мне нужно преобразовать отметку времени Эрланга в 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 Ответ

2 голосов
/ 24 апреля 2019

В документации четко указано этот формат не поддерживается :

, в то время как ISO 8601 позволяет datetime указывать 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
...