アルパカログ

Webエンジニア兼マネージャーがプログラミングやマネジメント、読んだ本のまとめを中心に書いてます。

Elixir DateTime型での日時の大小比較に比較演算子(不等号)を使ってはいけない

f:id:otoyo0122:20201114105315p:plain:w300

いくつかの広く普及しているプログラミング言語において、日時型同士の比較に比較演算子 (==>など) を使うことはよくあります。

しかし、Elixirでは日時型の比較に比較演算子を使うと思いもよらない結果になります。下記の例を見てください。

iex> dt1 = %DateTime{calendar: Calendar.ISO, day: 12, hour: 0, month: 1, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0, year: 2017, zone_abbr: "UTC", microsecond: {878630, 6}, minute: 57, second: 59}
#DateTime<2017-01-12 00:57:59.878630Z>
iex> dt2 = %DateTime{calendar: Calendar.ISO, day: 12, hour: 0, month: 1, std_offset: 0, time_zone: "Etc/UTC", utc_offset: 0, year: 2017, zone_abbr: "UTC", microsecond: {481183, 6}, minute: 58, second: 2}
#DateTime<2017-01-12 00:58:02.481183Z>
iex> dt1 <= dt2
false

Elixirにおいて構造体は特殊なマップであり、日時を表すDateTimeも例外ではありません。

そのためDateTimeの比較にはDateTime.compare/2を使わなければなりません。

iex> DateTime.compare(dt1, dt2)
:lt