我如何判断给定的 NaiveDateTime(加上像 "US/Mountain" 这样的时区)在 Elixir 中是否过去了?

How do I tell if a given NaiveDateTime (plus timezone like "US/Mountain") is in the past in Elixir?

假设我有 ndt 类型 NaiveDateTime 和一个字符串 tz,如 "US/Mountain"。我怎样才能知道 tz 中的 ndt 是否是过去的?

默认情况下,Elixir 不包含时区数据库,但如果您添加时区,它确实支持时区。在撰写本文时,最简单的方法是使用 Tzdata, but check the DateTime docs 获取最新建议。

  1. {:tzdata, "~> 1.1"} 添加到 mix.exs
  2. config :elixir, :time_zone_database, Tzdata.TimeZoneDatabase 添加到 config/config.exs
  3. 使用 DateTime.from_naive!/3 转换为时区感知 DateTime
  4. 使用 DateTime.compare/2 将日期与现在进行比较。
~N[2000-01-01 10:10:10]
|> DateTime.from_naive!("US/Mountain")
|> DateTime.compare(DateTime.utc_now())
|> Kernel.==(:lt)

输出:

true

配置示例:

# config/config.exs
import Config
config :elixir, :time_zone_database, Tzdata.TimeZoneDatabase