Объединить дату и время с датой и временем
Используя Эликсир Timex
библиотека, как я могу преобразовать Date
и Time
к DateTime
?
Скажи у меня есть следующее date
а также time
iex> date = ~D[2018-01-01]
iex> time = ~T[00:00:01.000]
Как я могу объединить их для вывода datetime
: #DateTime<2018-01-01 00:00:01Z>
чистым способом?
Лучшее, что я придумаю, это:
Timex.add(Timex.to_datetime(date), Timex.Duration.from_time(time))
но я чувствую, что, несомненно, есть более хороший и понятный способ объединить это.
Будем весьма благодарны за любые предложения по лучшему способу преобразования этого.
3 ответа
Если вы используете библиотеку календаря, вы можете использовать либо функцию Calendar.DateTime.from_date_and_time_and_zone, либо функцию Calendar.NaiveDateTime.from_date_and_time:
iex(4)> Calendar.DateTime.from_date_and_time_and_zone(~D[2018-10-01], ~T[12:22:22], "Australia/Melbourne")
{:ok, #DateTime<2018-10-01 12:22:22+10:00 AEST Australia/Melbourne>}
iex(5)> Calendar.NaiveDateTime.from_date_and_time(~D[2018-10-01], ~T[12:22:22])
{:ok, ~N[2018-10-01 12:22:22]}
Есть также from_date_and_time! и from_date_and_time! варианты.
Плюс календарь имеет преимущество перед timex в том, что его расчет часового пояса не глючит.
Ты можешь использовать NaiveDateTime.new/2
:
iex> NaiveDateTime.new(date, time)
{:ok, ~N[2018-01-01 00:00:01.000]}
Причина, по которой это "наивное время-дата" вместо даты-времени состоит в том, что Time
Структура не содержит информацию о часовом поясе. Если вы знаете часовой пояс, вы можете добавить эту информацию, используя DateTime.from_naive/2
:
iex> DateTime.from_naive(~N[2018-01-01 00:00:01.000], "Etc/UTC")
{:ok, #DateTime<2018-01-01 00:00:01.000Z>}
Несмотря на то, что ответ @legoscia совершенно действителен, здесь описывается, как вы справляетесь с парой даты и времени Timex
, просто стандартная библиотека чистого эликсира):
date = ~D[2018-01-01]
time = ~T[00:00:01.000]
{Date.to_erl(date), Time.to_erl(time)}
|> NaiveDateTime.from_erl!()
|> DateTime.from_naive("Etc/UTC")
#⇒ {:ok, #DateTime<2018-01-01 00:00:01Z>}