【问题标题】:Elixir: How to sort a list of (naive) datetimes?Elixir:如何对(天真的)日期时间列表进行排序?
【发布时间】:2020-06-25 10:52:11
【问题描述】:

我有一个 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]]

【问题讨论】:

    标签: sorting datetime elixir


    【解决方案1】:

    由于v1.9 Enum.sort/2 接受导出compare/2 的模块。

    Enum.sort(naive_date_times, NaiveDateTime)
    Enum.sort(dates, Date)
    

    【讨论】:

      【解决方案2】:

      如果所有值都是 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 来推断任何 NaiveDateTimes 的 UTC 时区:

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

      【讨论】:

      • 虽然绝对正确,但自从v1.9 以来,这个答案有点过时了,详情请查看我的答案。
      猜你喜欢
      • 2013-01-06
      • 2019-03-12
      • 1970-01-01
      • 1970-01-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      相关资源
      最近更新 更多