Эликсир конвертирует дату и время в строку

У меня есть необработанный sql-запрос, который возвращает поле даты и времени, и я хочу вернуть json с этими результатами.

Если я помещу возвращаемое значение, я получу жалобу:

(Poison.EncodeError) unable to encode value: {{2017, 3, 21}, {0, 0, 0, 0}}

Если я попытаюсь преобразовать его в строку, используя Timex:

Timex.format!(Ecto.DateTime.from_erl(datetime_field), "%Y-%m-%d %H:%M:%S", :strftime)

Я получил:

** (FunctionClauseError) no function clause matching in Ecto.DateTime.from_erl/1

Если я пропущу часть from_erl:

Timex.format!(datetime_field, "%Y-%m-%d %H:%M:%S", :strftime)

Я получил:

** (Poison.EncodeError) unable to encode value: {:error, :invalid_date}


person Romeo Mihalcea    schedule 21.03.2017    source источник


Ответы (2)


Чтобы получить стандартное значение даты и времени erlang, необходимо удалить четвертое значение (микросекунды) из второго кортежа:

datetime = {{2017, 3, 21}, {0, 0, 0, 0}}
{{year, month, day}, {hours, minutes, seconds, _}} = datetime
datetime = {{year, month, day}, {hours, minutes, seconds}}
Poison.encode! Ecto.DateTime.from_erl(datetime)
#=> "\"2017-03-21T00:00:00\""
person Alex Avoiants    schedule 21.03.2017
comment
не собирался находить это в ближайшее время - person Romeo Mihalcea; 22.03.2017

Согласно журналу изменений Ecto 3.0, Ecto.DateTime больше не существует. В тех случаях, когда у вас нет информации о часовом поясе, вы можете использовать NaiveDateTime.from_erl() вместо Ecto.DateTime.from_erl().

Если вам нужно больше форматирования помимо базового материала iso8601 или to_string, вы можете посмотреть https://hexdocs.pm/timex/Timex.html#format/2

person Everett    schedule 03.04.2019