6

我有一个原始 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}

4

2 回答 2

5

要获得标准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\""
于 2017-03-21T22:56:02.463 回答
1

根据 Ecto 3.0 变更日志,Ecto.DateTime不再存在。在您没有可用时区信息的情况下,您可以NaiveDateTime.from_erl()使用Ecto.DateTime.from_erl()

如果您需要基本 iso8601 或 to_string 之外的更多格式,您需要查看https://hexdocs.pm/timex/Timex.html#format/2

于 2019-04-03T19:34:55.140 回答