使用 Elixir 格式化日期
Format date with Elixir
我正在尝试格式化 Timex 模块以使其看起来像某种方式。我正在尝试获取今天的日期。但我希望它的格式如下:
2017/12/12.
year/mn/day
在 ruby 我会去 strftime class 但我不确定如何用 Elixir 做到这一点:
当前尝试:
Timex.local => #DateTime<2017-12-12 19:57:17.232916-05:00 EST America/Detroit>
我如何获取它并按照我指定的方式对其进行格式化?
看来 Timex 模块有一个 format!/2
函数,它将 return 一个字符串,其中包含您传递给它的任何日期。
这是我想出的:
Timex.local |> Timex.format!("{YYYY}/{M}/{D}")
=> "2017/12/12"
Timex
是在Elixir对dates/times没有很好支持的年代创建的第三方库。如今,核心中有 DateTime
原生 class,所以我不确定你为什么要使用 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"
用前导零填充“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"
如果你想在没有外部库的情况下执行此操作,你可以使用 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"
您可以这样做来添加零
Timex.local |> Timex.format!("{YYYY}/0{M}/0{D}") => "2017/01/01"
添加 0 填充的答案不正确,即使不需要,也会始终填充 0。正确补0的方法如下:
Timex.local |> Timex.format!("{YYYY}/{0M}/{0D}") => "2017/01/01"
Elixir 1.11 内置了 Calendar.strftime/3 以满足您的 strftime
需求。
Calendar.strftime(~U[2019-08-26 13:52:06.0Z], "%y-%m-%d %I:%M:%S %p")
"19-08-26 01:52:06 PM"
从 Elixir 1.11 开始,您可以使用标准库的 Calendar
模块中的日期格式化程序理智地完成此操作:
https://hexdocs.pm/elixir/1.13.0/Calendar.html#strftime/3
DateTime.utc_now()
|> Calendar.strftime("%Y/%m/%d")
"2022/01/12"
我正在尝试格式化 Timex 模块以使其看起来像某种方式。我正在尝试获取今天的日期。但我希望它的格式如下:
2017/12/12.
year/mn/day
在 ruby 我会去 strftime class 但我不确定如何用 Elixir 做到这一点:
当前尝试:
Timex.local => #DateTime<2017-12-12 19:57:17.232916-05:00 EST America/Detroit>
我如何获取它并按照我指定的方式对其进行格式化?
看来 Timex 模块有一个 format!/2
函数,它将 return 一个字符串,其中包含您传递给它的任何日期。
这是我想出的:
Timex.local |> Timex.format!("{YYYY}/{M}/{D}")
=> "2017/12/12"
Timex
是在Elixir对dates/times没有很好支持的年代创建的第三方库。如今,核心中有 DateTime
原生 class,所以我不确定你为什么要使用 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"
用前导零填充“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"
如果你想在没有外部库的情况下执行此操作,你可以使用 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"
您可以这样做来添加零
Timex.local |> Timex.format!("{YYYY}/0{M}/0{D}") => "2017/01/01"
添加 0 填充的答案不正确,即使不需要,也会始终填充 0。正确补0的方法如下:
Timex.local |> Timex.format!("{YYYY}/{0M}/{0D}") => "2017/01/01"
Elixir 1.11 内置了 Calendar.strftime/3 以满足您的 strftime
需求。
Calendar.strftime(~U[2019-08-26 13:52:06.0Z], "%y-%m-%d %I:%M:%S %p")
"19-08-26 01:52:06 PM"
从 Elixir 1.11 开始,您可以使用标准库的 Calendar
模块中的日期格式化程序理智地完成此操作:
https://hexdocs.pm/elixir/1.13.0/Calendar.html#strftime/3
DateTime.utc_now()
|> Calendar.strftime("%Y/%m/%d")
"2022/01/12"