我是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也是我正在处理的冗长而复杂的代码片段 - 此时我开始感觉事情正在发生偏离轨道。
建议赞赏!
答案 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.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.Time
或Ecto.DateTime
等基本类型。
这可以直接通过管道传输到Calendar
的格式,如下所示:
@ecto_struct.some_time |> Calendar.Strftime.strftime! "%I:%M%P"
将导致:
"02:30pm"
您所要做的就是添加Calecto
作为依赖项:
defp deps do
[ {:calecto, "~> 0.4.1"}, ]
end