Объединить дату и время с датой и временем - PullRequest
0 голосов
/ 29 апреля 2019

Используя Timex библиотеку Elixir , как я могу преобразовать 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 ]

3 голосов
/ 01 мая 2019

Если вы используете библиотеку calendar , вы можете использовать либо функцию 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 в том, что его расчет часового пояса не является глючным .

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

Несмотря на то, что ответ @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>}
1 голос
/ 29 апреля 2019

Вы можете использовать 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>}
...