0

使用 Elixir 的Timex如何将 aDate和 a转换Time为 a DateTime

说我有以下datetime

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))

但我觉得肯定有一种更好、更易读的方式来结合它。

任何有关转换它的更好方法的建议将不胜感激。

4

3 回答 3

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!从_date_and_time 变体。

Plus calendar 比 timex 的优势在于它的时区计算没有错误

于 2019-05-01T03:24:40.260 回答
3

您可以使用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>}
于 2019-04-29T13:36:01.010 回答
2

虽然@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>}
于 2019-04-29T14:26:48.737 回答