如何在Elixir中解析DateTime?

Koo*_*oro 4 datetime date elixir

如何从元组中创建(Ecto.),或者从Elixir中的字符串中解析它?我应该使用Erlang吗?DateTime{DD, MM, YY}DateTime

我用Google搜索但没有找到任何内容,文档中没有关于此事的任何内容,只是DateTime一般情况下 - 例如,如何获取当前日期和时间.

请注意,我不想使用第三方库,例如Timex.

Mar*_*lin 7

只是添加贾斯汀给出的答案.Elixir的标准库可以解析ISO 8601日期.

iex> Date.from_iso8601("2015-01-23")
{:ok, ~D[2015-01-23]}
Run Code Online (Sandbox Code Playgroud)

或者使用bang-version,可能会引发错误:

iex> Date.from_iso8601!("2015-01-23")
~D[2015-01-23]
Run Code Online (Sandbox Code Playgroud)

如果你想要一个ISO 8601字符串的完整日期时间,你必须对NaiveDateTime感到满意,因为没有可靠的时区信息.

iex> NaiveDateTime.from_iso8601("2015-01-23 23:50:07")
{:ok, ~N[2015-01-23 23:50:07]}
Run Code Online (Sandbox Code Playgroud)

请注意,它只会丢弃时区偏移量.

from_iso8601/1将来会有一个关于DateTime的版本,但它最近被添加,并且从Elixir v1.3.4开始还没有发布.它将保留时区偏移,但将时区设置为UTC.

  • 此函数`from_iso8601/1`已在[Elixir v1.5.1](https://hexdocs.pm/elixir/DateTime.html#from_iso8601/2)中实现. (3认同)

Jus*_*ood 6

要获取当前日期和/或时间,您可以使用以下之一

Ecto.Date.utc
Ecto.Time.utc
Ecto.DateTime.utc
DateTime.utc_now
Run Code Online (Sandbox Code Playgroud)

至于将{DD, MM, YY}元组转换为元组Ecto.Date,您将无法使用 ecto 提供的函数来做到这一点。但是,您可以使用{YYYY, MM, DD}元组转换为Ecto.Date.

Ecto.Date.from_erl({2016, 12, 4})
#Ecto.Date<2016-12-04>

Date.from_erl({2016, 12, 4})
{:ok, ~D[2016-12-04]}

Ecto.Time.from_erl({13, 55, 10})
#Ecto.Time<12:10:08>

Ecto.Time.from_erl({13, 55, 10})
{:ok, ~T[13:55:10]}

Ecto.DateTime.from_erl({{2016, 12, 4}, {13, 55, 10}})
#Ecto.DateTime<2016-12-04 13:55:10>

Ecto.Date.from_erl({2016, 12, 4}) |> Ecto.DateTime.from_date()
#Ecto.Date<2016-12-04>
Run Code Online (Sandbox Code Playgroud)

您只需要确保您的数据按照这些函数期望的正确顺序排列即可。

至于从字符串中解析它们,您要么需要引入另一个库,要么自己编写一个解析器。