Top*_*unt 3 sorting datetime elixir
我有一个 NaiveDateTimes 列表,我想获得最新的。对 DateTimes / NaiveDateTimes 列表进行排序的最简单方法是什么?
我知道使用 Elixir 的标准排序规则是不安全的,因为它在结构上比较术语而不是查看日期的含义:
# UNSAFE / returns entries in incorrect order:
[~N[2020-02-29 10:00:01], ~N[2020-03-11 10:20:00], ~N[2020-03-15 10:00:00]] |> Enum.sort
# => [~N[2020-03-11 10:20:00], ~N[2020-03-15 10:00:00], ~N[2020-02-29 10:00:01]]
Run Code Online (Sandbox Code Playgroud)
由于v1.9 Enum.sort/2接受一个导出compare/2.
Enum.sort(naive_date_times, NaiveDateTime)
Enum.sort(dates, Date)
Run Code Online (Sandbox Code Playgroud)
如果所有值都是 DateTime (带时区),您可以使用DateTime.compare:
sorted = Enum.sort(datetimes, & DateTime.compare(&1, &2) != :gt)
Run Code Online (Sandbox Code Playgroud)
如果所有值都是 NaiveDateTime (无时区数据),您可以使用NaiveDateTime.compare:
sorted = Enum.sort(datetimes, & NaiveDateTime.compare(&1, &2) != :gt)
Run Code Online (Sandbox Code Playgroud)
如果你很懒并且/或安装了 Timex,你可以使用Timex.diff它将推断任何 NaiveDateTimes 的 UTC 时区:
sorted = Enum.sort(datetimes, & Timex.diff(&1, &2) < 0)
Run Code Online (Sandbox Code Playgroud)