UTC 和 DateTime 结构的 Elixir 时区比较

Elixir Timezone Comparison for UTC and DateTime Struct

提问人:l288 提问时间:3/29/2022 更新时间:3/29/2022 访问量:504

问:

我正在尝试比较两个日期时间,看看它们是否重叠。但是,一个是 DateTime 结构,另一个是 ~U[] 时间 - 这就是它们从数据库中出来的方式。我无法弄清楚如何做到这一点 - 如果我可以在 UTC 中比较它们并保持时区意识,那就太好了。

我有两次是: start_datetime_1 = ~U[2022-03-31 11:15:00.000000Z]

starttime_2 = #DateTime<2022-03-31 11:15:00.000000+01:00 BST Europe/London>

我想做一些类似的事情:DateTime.compare(start_datetime_1, start_datetime_2 == :gt || :eq)

任何帮助将不胜感激!

日期时间 时区 Erlang Elixir 比较

评论


答:

6赞 Aleksei Matiushkin 3/29/2022 #1

~U[2022-03-31 11:15:00.000000Z]是一样的,但在 .印记只是句法糖。DateTimeUTC~U[]

您可以开箱即用地使用 DateTime.compare/2 进行比较。它了解时区。

DateTime.compare(start_datetime_1, start_datetime_2) in [:gt, :eq]

评论

0赞 l288 3/29/2022
谢谢。这有效,但是,当我尝试在 iex 中运行该函数时,出现此错误:您知道为什么会这样吗?* (FunctionClauseError) no function clause matching in DateTime.compare/2 The following arguments were given to DateTime.compare/2: # 1 "2022-03-25 01:00:00.058104+00" # 2 ~U[2022-03-25 12:00:00.058104Z] Attempted function clauses (showing 1 out of 1): def compare(%{utc_offset: utc_offset1, std_offset: std_offset1} = datetime1, %{utc_offset: utc_offset2, std_offset: std_offset2} = datetime2)
0赞 Aleksei Matiushkin 3/29/2022
您传递的第一个参数是二进制。它必须是一个实例。在它上面调用一个。DateTimeDateTime.from_iso8601/1