[elixir! 55] DateTime 的正确比较方法

用 Ecto 的时候通常会自动添加 timestamp(), 它的类型是 DateTime.

在 iex 里面看是这样的:

~U[2019-10-31 15:52:49Z]

它的本质是一个 Map 结构, 如果直接进行比较, 会不准确:

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 再比较:

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]}
阅读 225

推荐阅读
log of think
用户专栏

Thinking , writing, hair losing.

39 人关注
81 篇文章
专栏主页
目录