【问题标题】:Formatting a time in Elixir在 Elixir 中格式化时间
【发布时间】:2018-09-16 17:55:35
【问题描述】:

我是 Elixir 的新手,正在尝试将 Rails API 移植到 Phoenix 作为一个学习项目。

我有一个 Postgres 时间字段,我已将其添加到 Ecto 方案

field :start_time, Ecto.Time

问题:我想将时间的 12 小时格式版本(例如 16:30)输出为字符串:例如,下午 4:30。我一直很难找到一种简单/标准的方法来做到这一点。

这是我目前最接近的解决方案:

def format_time(time) do
  {:ok, {hours,minutes,y, z}} = Ecto.Time.dump(time)
  {hour, ampm} = Timex.Time.to_12hour_clock(hours)
  "#{hour}:#{minutes}#{ampm}"
end

对于我认为已经有更简洁和标准实现的东西来说,这似乎是一段可笑且长得可笑的代码;此外,它还存在输出下午 2:0 而不是下午 2:00 的问题——用尾随零格式化 0 是我正在处理的又长又复杂的代码——此时我开始感觉事情正在发生偏离轨道。

建议!

【问题讨论】:

    标签: elixir phoenix-framework


    【解决方案1】:

    您可以使用timex 的格式化工具,因为您已经在使用它,但首先您需要将Ecto.Time 更改为可以使用这些工具格式化的Timex.DateTime

    use Timex
    
    {{0, 0, 0}, Ecto.Time.to_erl(time)}
    |> Timex.Date.from
    |> DateFormat.format!("{h12}:{0m} {am}")
    

    【讨论】:

    • 这是我最终得到的相同解决方案的更简洁版本,因此分钟的格式仍然很差,为下午 2:0 而不是下午 2:30。
    • 感谢 Pawel 的提示,这帮助我找到了解决方案!
    • 糟糕,忘记了。您需要使用 {0m} 格式指令数分钟来填充零。
    • 所以是DateFormat.format的strftime版本! Sevenseascat 提到的那个也很好用,但由于这是一个非常完整的答案,我会将其标记为已接受的答案。
    【解决方案2】:

    我遇到了同样的问题,并且使用了像 Timex 这样的库。 这就是我处理日期的方式。不知道有没有更好的工作案例。

    在这种情况下,您可以使用Calendar.Strftime 作为格式化的日期/时间字符串。

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

      您使用的是 Timex,但不是它的 format! 方法,它允许轻松格式化时间和日期。

      https://david.padilla.cc/posts/19-date-formatting-in-phoenix-elixir 是一篇关于使用 Timex 的好文章。

      您似乎可以执行以下操作:

      Timex.DateFormat.format!(time, "%H:%M%P", :strftime)
      

      有关格式选项的完整列表,请参阅 https://github.com/bitwalker/timex/blob/master/lib/format/datetime/formatters/strftime.ex

      【讨论】:

      • 这对我不起作用,我在 Timex.DateFormat.format!/3 中得到一个无功能子句匹配 - 我认为这与我有时间而不是日期时间有关?
      • 感谢 Sevenseacat 的建议——这并没有让我完全到达那里,但加上 Pawel Obrok 的建议,它帮助我走上了正轨!
      【解决方案4】:

      一种简单的方法是使用Calendar 中提供的strftime 字符串格式。使用Calecto,您甚至可以使用Ecto.TimeEcto.DateTime 等基本类型。 这可以直接通过管道传输到Calendar 的格式,如下所示:

      @ecto_struct.some_time |> Calendar.Strftime.strftime! "%I:%M%P"
      

      将导致:

      "02:30pm"
      

      您所要做的就是添加 Calecto 作为依赖项:

      defp deps do
        [ {:calecto, "~> 0.4.1"}, ]
      end
      

      【讨论】:

      • 感谢@lau 看到您在 ElixirConf 的演讲,并会特别关注这些库!
      【解决方案5】:

      这是我得出的可行解决方案,它结合了 Pawel、Obrok 和 Sevenseascat 的答案 - 加上将会议记录转换为 00 格式。

      def formatted_time(time) do
        {{0, 0, 0}, Ecto.Time.to_erl(time)} |> 
        Timex.Date.from |> 
        DateFormat.format!("%I:%M%P", :strftime)
      end
      

      【讨论】:

      • 很高兴听到它已解决 :) 我不确定 Ecto.Time 和 Timex.Time 之间的确切转换,但我很高兴无论如何我都能提供帮助!
      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-26
      • 2012-06-24
      • 1970-01-01
      相关资源
      最近更新 更多