Эликсир: Как отсортировать список (наивных) дат? - PullRequest
1 голос
/ 13 марта 2020

У меня есть список 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]]

Ответы [ 2 ]

4 голосов
/ 13 марта 2020

Поскольку v1.9 Enum.sort/2 принимает модуль, который экспортирует compare/2.

Enum.sort(naive_date_times, NaiveDateTime)
Enum.sort(dates, Date)
1 голос
/ 13 марта 2020

Если все значения имеют DateTime (с часовым поясом), вы можете использовать DateTime.compare:

sorted = Enum.sort(datetimes, & DateTime.compare(&1, &2) != :gt)

Если все значения - NaiveDateTime (без данных о часовом поясе), вы можете использовать NaiveDateTime.compare:

sorted = Enum.sort(datetimes, & NaiveDateTime.compare(&1, &2) != :gt)

И если вы ленивы и / или у вас установлен Timex, вы можете использовать Timex.diff, который выведет UT C часовой пояс для любого NaiveDateTimes:

sorted = Enum.sort(datetimes, & Timex.diff(&1, &2) < 0)
...