格式化Elixir中的时间

时间:2015-08-11 13:39:22

标签: elixir phoenix-framework

我是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:0pm而不是下午2:00的问题 - 用尾随零格式化0也是我正在处理的冗长而复杂的代码片段 - 此时我开始感觉事情正在发生偏离轨道。

建议赞赏!

5 个答案:

答案 0 :(得分:10)

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

use Timex

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

答案 1 :(得分:6)

您使用的是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

答案 2 :(得分:5)

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

  • Calendar用于解析和一些函数。
  • Calecto使用 CalendarEcto
  • 。{

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

我希望它有所帮助。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

一种简单的方法是使用strftime中提供的Calendar字符串格式。使用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