使用Elixir格式化日期

Bit*_*ise 2 datetime elixir timex

我正在尝试将Timex模块格式化为某种方式.我想要今天的约会.但我希望它的格式如下:

2017年12月12日.

年/分钟/天

在ruby中我会去strftime类,但我不知道如何使用Elixir:

目前的尝试:

Timex.local => #DateTime<2017-12-12 19:57:17.232916-05:00 EST America/Detroit>
Run Code Online (Sandbox Code Playgroud)

我该如何处理并格式化我指定的方式?

Ale*_*kin 7

Timex是一个第三方图书馆,是在Elixir对日期/时间没有很好支持的时代创建的.如今,DateTime核心有本机类,所以我不确定你为什么要使用它Timex.

无论如何,DateTime是一个结构:

iex|1 ? today = DateTime.utc_now
#? #DateTime<2017-12-13 07:22:58.290075Z>
iex|2 ? [today.year, today.month, today.day]
#? [2017, 12, 13]
iex|3 ? Enum.join [today.year, today.month, today.day], "/"
#? "2017/12/13"
Run Code Online (Sandbox Code Playgroud)

要使用"2018/1/1"的前导零填充:

iex|4 ? with {:ok, today} <- Date.new(2018, 1, 1) do
...|4 ?   [today.year, today.month, today.day]
...|4 ?   |> Enum.map(&to_string/1)
...|4 ?   |> Enum.map(&String.pad_leading(&1, 2, "0"))
...|4 ?   |> Enum.join("/")
...|4 ? end
#? "2018/01/01"
Run Code Online (Sandbox Code Playgroud)

  • 我认为,基本上,人们仍然想要使用Timex,如果他们需要进行格式化,Elixir仍然没有任何好的方法来做我能看到的. (3认同)

tre*_*res 7

Elixir 1.11 has Calendar.strftime/3 built-in for your strftime needs.

Calendar.strftime(~U[2019-08-26 13:52:06.0Z], "%y-%m-%d %I:%M:%S %p")
"19-08-26 01:52:06 PM"
Run Code Online (Sandbox Code Playgroud)


Dog*_*ert 6

如果要在没有外部库的情况下执行此操作,则可以io_lib:format/2在必要时使用零填充整数,如下所示:

iex(1)> date = Date.utc_today
~D[2017-12-13]
iex(2)> :io_lib.format("~4..0B/~2..0B/~2..0B", [date.year, date.month, date.day]) |> IO.iodata_to_binary
"2017/12/13"
iex(3)> {:ok, date} = Date.new(2018, 1, 1)
{:ok, ~D[2018-01-01]}
iex(4)> :io_lib.format("~4..0B/~2..0B/~2..0B", [date.year, date.month, date.day]) |> IO.iodata_to_binary
"2018/01/01"
iex(5)> {:ok, date} = Date.new(1, 1, 1)
{:ok, ~D[0001-01-01]}
iex(6)> :io_lib.format("~4..0B/~2..0B/~2..0B", [date.year, date.month, date.day]) |> IO.iodata_to_binary
"0001/01/01"
Run Code Online (Sandbox Code Playgroud)


Dig*_*yay 6

你可以这样做来添加零

Timex.local |>  Timex.format!("{YYYY}/0{M}/0{D}") => "2017/01/01"
Run Code Online (Sandbox Code Playgroud)