使用Elixir格式化日期

时间:2017-12-13 01:01:00

标签: datetime elixir timex

我试图将Timex模块格式化为某种特定方式。我想要今天约会。但我希望它的格式如下:

2017年12月12日

年/ MN /天

在红宝石中,我会去strftime课程,但我不确定如何使用Elixir:

目前的尝试:

Timex.local => #DateTime<2017-12-12 19:57:17.232916-05:00 EST America/Detroit>

我该如何处理并按照指定格式进行格式化?

6 个答案:

答案 0 :(得分: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"

用&#34; 2018/1/1&#34;的前导零填充:

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"

答案 1 :(得分:5)

如果你想在没有外部库的情况下这样做,你可以使用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"

答案 2 :(得分:5)

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"

答案 3 :(得分:3)

所以看来Timex模块有一个format!/2函数,它会返回一个你传递给它的日期字符串。

这是我提出的: Timex.local |> Timex.format!("{YYYY}/{M}/{D}") =&gt; "2017/12/12"

答案 4 :(得分:2)

您可以执行此操作以添加零

setInterval(()=>{//setstate here},time_in_ms)

答案 5 :(得分:1)

添加0填充的答案不正确,即使不需要也总是填充0。填充0s的正确方法如下:

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