在 Elixir 中格式化时间

Formatting a time in Elixir

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

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

field :start_time, Ecto.Time

问题: 我想输出一个 12 小时格式的时间版本,例如 16:30 作为字符串:4:30pm,对于例子。我一直无法找到 easy/standard 的方法来执行此操作。

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

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:0pm 而不是 2:00 pm 的问题——用尾随零格式化 0 是我正在处理的又长又复杂的一段代码——此时我开始感到好像事情偏离了轨道。

感谢您的建议!

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

  • Calendar 用于解析和一些功能。
  • Calecto 用于使用 CalendarEcto

在这种情况下,您可以使用 Calendar.Strftime 格式化 date/time 字符串。

希望对您有所帮助。

您使用的是 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 的格式化工具,因为您已经在使用它,但首先您需要将 Ecto.Time 更改为可以使用这些工具格式化的 Timex.DateTime .

use Timex

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

这是我得出的可行解决方案,它结合了 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

一种简单的方法是使用 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