格式化Elixir中的时间

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了格式化Elixir中的时间相关的知识,希望对你有一定的参考价值。

我是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也是我正在处理的冗长而复杂的代码片段 - 此时我开始感觉事情正在发生偏离轨道。

建议赞赏!

答案

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

use Timex

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

你正在使用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这样的库。这是我如何处理日期的方式。我不知道是否有更好的工作案例。

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

我希望它有所帮助。

另一答案

一个简单的方法是使用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
另一答案

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

以上是关于格式化Elixir中的时间的主要内容,如果未能解决你的问题,请参考以下文章

SpaceVim 语言模块 elixir

使用 Erlang 的 Elixir 模块失败

如何将匿名函数传递给 Elixir 中的管道

text 用于git的Elixir预推钩 - 确保文件格式正确并且信条满足

Elixir 中的动态主管规范

如何在 Javadoc 中使用 @ 和 符号格式化代码片段?