[elixir! 55] DateTime 的正確比較方法

用 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]}
相關文章
相關標籤/搜索