Elixir:如何对(天真的)日期时间列表进行排序?

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)

Ale*_*kin 9

由于v1.9 Enum.sort/2接受一个导出compare/2.

Enum.sort(naive_date_times, NaiveDateTime)
Enum.sort(dates, Date)
Run Code Online (Sandbox Code Playgroud)


Top*_*unt 6

如果所有值都是 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)