将日期和时间合并为日期时间
Combine date and time to a datetime
如何使用 Elixir 的 Timex
library 将 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))
但我觉得肯定有更好、更易读的方法来结合它。
任何关于更好的转换方法的建议都将不胜感激。
您可以使用 NaiveDateTime.new/2
:
iex> NaiveDateTime.new(date, time)
{:ok, ~N[2018-01-01 00:00:01.000]}
它是 "naive datetime" 而不是日期时间的原因是 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
,只是纯 Elixir 标准库):
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>}
如果您使用的是calendar library, you can use either the Calendar.DateTime.from_date_and_time_and_zone function or the 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! and from_date_and_time! 个变体。
Plus calendar 相对于 timex 的优势在于它的时区计算不是 buggy.
如何使用 Elixir 的 Timex
library 将 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))
但我觉得肯定有更好、更易读的方法来结合它。
任何关于更好的转换方法的建议都将不胜感激。
您可以使用 NaiveDateTime.new/2
:
iex> NaiveDateTime.new(date, time)
{:ok, ~N[2018-01-01 00:00:01.000]}
它是 "naive datetime" 而不是日期时间的原因是 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
,只是纯 Elixir 标准库):
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>}
如果您使用的是calendar library, you can use either the Calendar.DateTime.from_date_and_time_and_zone function or the 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! and from_date_and_time! 个变体。
Plus calendar 相对于 timex 的优势在于它的时区计算不是 buggy.