Подтвердить что ты не робот

Форматирование времени в Эликсир

Я новичок в 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 с завершающим нолем было дополнительно длинным и сложным фрагментом кода, над которым я работал, - в этот момент я начал чувствовать, что все идет путь назад.

Советы оценены!

4b9b3361

Ответ 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