Форматирование времени в Эликсир
Я новичок в Elixir, пытаясь перенести Rails API в Phoenix в качестве учебного проекта.
У меня есть поле времени Postgres, которое я добавил к схеме Ecto:
field :start_time, Ecto.Time
Проблема: Я хотел бы выпустить 12-часовую отформатированную версию времени, например 16:30, в виде строки: например, 16: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 с завершающим нолем было дополнительно длинным и сложным фрагментом кода, над которым я работал, - в этот момент я начал чувствовать, что все идет путь назад.
Советы оценены!
Ответы
Ответ 1
Вы можете использовать средства форматирования timex
, поскольку вы уже используете это, но сначала вам нужно изменить свой Ecto.Time
на Timex.DateTime
, который может быть отформатирован с ними.
use Timex
{{0, 0, 0}, Ecto.Time.to_erl(time)}
|> Timex.Date.from
|> DateFormat.format!("{h12}:{0m} {am}")
Ответ 2
Вы используете 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.
Ответ 3
У меня была такая же проблема и с использованием библиотеки, например Timex
.
Это мой способ обработки дат. Я не знаю, есть ли лучшие дела.
- Calendar для синтаксического анализа и некоторых функций.
- Calecto для использования
Calendar
с Ecto
В этом случае вы можете использовать Calendar.Strftime для форматированной строки даты/времени.
Надеюсь, это поможет.
Ответ 4
Это выполнимое решение, к которому я пришел, в котором была комбинация ответов от 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
Ответ 5
Простым способом это использовать 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