在 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.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.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
我是 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.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.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