我有一个格式为
"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
如果您不想依赖 Timex 模块:
birthday = "01/12/2012"
[dd, mm, yyyy] = String.split(birthday, "/")
{:ok, date} = Date.from_iso8601("#{yyyy}-#{mm}-#{dd}")
date
==> ~D[2012-12-01]
如果需要将日期字符串解析为 Date 结构体,可以使用 timex 库:
iex> "01/01/2019" |> Timex.parse!("{D}/{0M}/{YYYY}") |> Timex.to_date()
{:ok, ~D[2019-01-01]}
看起来您对
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).()
Date.from_iso8601/2
的长生不老药。
像这样使用它(从文档复制):
iex> Date.from_iso8601("2015-01-23")
{:ok, ~D[2015-01-23]}
还有
Date.from_iso8601!/2
如果你不想处理元组并且不介意在字符串无效时引发函数。
这对OP没有帮助,因为这需要更标准的字符串YYYY-MM-DD格式。我想分享它,以防人们从谷歌最终来到这里,并且不需要重新格式化日期字符串的额外工作。