使用 Elixir 将日期和时间转换为未来的日期

converting day and time to date in future using Elixir

我有这个数据

%{
  day: "sun"
  since: ~T[13:30:00],
  till: ~T[14:30:00]
}

我正在尝试使用

从中创建一个 DateTime
Enum.reduce_while(1..7, DateTime.utc_now(), fn _day, acc ->
  current_day =
    acc
      |> Timex.weekday()
      |> Timex.day_shortname()
      |> String.downcase()

  if current_day != hour.day,
    do: {:cont, Timex.shift(acc, days: 1)},
    else: {:halt, acc}
end)
|> DateTime.to_date()
|> NaiveDateTime.new(hour.since)
|> elem(1)
|> DateTime.from_naive!("Etc/UTC")

这很好用。但我想征求一个建议,有没有更简单的方法来解决这个问题?

我不确定为什么要使用 Timex 来计算这种微不足道的数学。您真正需要的是①将适当的天数添加到 Date.utc_today() 和 ② 将其与 hour.since:

粘合
shift =
  ~w|mon tue wed thu fri sat sun|
  |> Enum.zip(1..7)
  |> Map.new()

date = Date.utc_today()
to_add =
  Integer.mod(7 + shift[hour.day] - Date.day_of_week(date), 7)

date
|> Date.add(to_add)
|> DateTime.new!(hour.since)
#⇒ ~U[2022-01-16 13:30:00Z]