Elixir,如何从字符串转换为 Ecto.Date?

问题描述 投票:0回答:4

我有一个格式为

"dd/mm/yyyy"
的日期字符串,我需要将该值转换为
Ecto.Date
格式。

我创建了一个这样的函数,但我想知道是否还有其他方法可以做到这一点。

defp format_birthday(birthday_string) do
  birthday = String.split(birthday_string, "/") |> Enum.reverse() |> Enum.join("-")

  Ecto.Date.cast(birthday)
end
string date casting elixir
4个回答
4
投票

如果您不想依赖 Timex 模块:

birthday = "01/12/2012"

[dd, mm, yyyy] = String.split(birthday, "/")
{:ok, date} = Date.from_iso8601("#{yyyy}-#{mm}-#{dd}")
date

==> ~D[2012-12-01]

3
投票

如果需要将日期字符串解析为 Date 结构体,可以使用 timex 库:

iex> "01/01/2019" |> Timex.parse!("{D}/{0M}/{YYYY}") |> Timex.to_date()
{:ok, ~D[2019-01-01]}

3
投票

看起来您对

Date
结构很满意。在这种情况下,我认为
Date.new/3
是最好的解决方案。

"13/12/2019"
|> String.split("/")
|> Enum.map(&String.to_integer/1)
|> (fn [day, month, year] -> Date.new(year, month, day) end).()

0
投票

这是一个较老的问题,但对于最近来这里的人们来说,我们现在有

Date.from_iso8601/2
的长生不老药。

像这样使用它(从文档复制):

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

还有

Date.from_iso8601!/2
如果你不想处理元组并且不介意在字符串无效时引发函数。

这对OP没有帮助,因为这需要更标准的字符串YYYY-MM-DD格式。我想分享它,以防人们从谷歌最终来到这里,并且不需要重新格式化日期字符串的额外工作。

© www.soinside.com 2019 - 2024. All rights reserved.