【问题标题】:Elixir, how to cast from string to Ecto.Date?Elixir,如何从字符串转换为 Ecto.Date?
【发布时间】:2019-11-18 07:57:09
【问题描述】:

我有一个格式为"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

【问题讨论】:

  • Ecto.Date 自 Elixir 1.3 以来已被弃用。你确定你不只是想要一个Date 结构吗?
  • 我不知道。谢谢!

标签: string date casting elixir


【解决方案1】:

看起来你对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).()

【讨论】:

    【解决方案2】:

    如果您不想依赖 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]}
      

      【讨论】:

      • {0M} 解析时等价于{M}。当您输出字符串时,即使用Timex.format(){0M} 的作用与{M} 不同,即{0M} 在返回的字符串中用前导0 填充单个数字月份。
      猜你喜欢
      • 2017-02-07
      • 2020-06-29
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2015-11-06
      • 2014-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多