用 Ecto 的时候一般会自动添加 timestamp()
, 它的类型是 DateTime.unix
在 iex 里面看是这样的:code
~U[2019-10-31 15:52:49Z]
它的本质是一个 Map 结构, 若是直接进行比较, 会不许确:class
iex> Enum.sort([~U[2019-11-01 04:06:52Z], ~U[2019-10-31 15:52:49Z]]) [~U[2019-11-01 04:06:52Z], ~U[2019-10-31 15:52:49Z]]
正确的方式能够是先转换为 unix timestamp 再比较:im
iex> Enum.sort_by([~U[2019-11-01 04:06:52Z], ~U[2019-10-31 15:52:49Z]], &DateTime.to_unix/1) [~U[2019-10-31 15:52:49Z], ~U[2019-11-01 04:06:52Z]]
注意, 若是是 native 时间戳(不包含时区), 要先转换成包含时区的 DateTime.时间戳
iex> DateTime.from_naive ~N[2019-10-18 10:06:59], "Etc/UTC" {:ok, ~U[2019-10-18 10:06:59Z]}