Sorting 长生不老药:如何对(天真的)日期时间列表进行排序?

Sorting 长生不老药:如何对(天真的)日期时间列表进行排序?,sorting,datetime,elixir,Sorting,Datetime,Elixir,我有一个日期时间列表,我想得到最近的一个。对DateTimes/DateTimes列表排序的最简单方法是什么 我知道使用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 # =>

我有一个日期时间列表,我想得到最近的一个。对DateTimes/DateTimes列表排序的最简单方法是什么

我知道使用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]]

如果所有值都是DateTime(带时区),则可以使用
DateTime。比较

sorted = Enum.sort(datetimes, & DateTime.compare(&1, &2) != :gt)
sorted = Enum.sort(datetimes, & NaiveDateTime.compare(&1, &2) != :gt)
如果所有值都是NaiveDateTime(无时区数据),则可以使用
NaiveDateTime.compare

sorted = Enum.sort(datetimes, & DateTime.compare(&1, &2) != :gt)
sorted = Enum.sort(datetimes, & NaiveDateTime.compare(&1, &2) != :gt)
如果您是懒惰的和/或安装了Timex,您可以使用
Timex.diff
来推断任何日期时间的UTC时区:

sorted = Enum.sort(datetimes, & Timex.diff(&1, &2) < 0)
sorted=Enum.sort(datetimes和Timex.diff(&1和&2)<0)
因为
v1.9
接受导出
compare/2
的模块

Enum.sort(naivedate\u次,NaiveDateTime)
枚举.排序(日期,日期)

虽然绝对正确,但这个答案有点过时,因为
v1.9
,请查看我的答案以了解详细信息。