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

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

しかし、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
Thank you!
Thank you!
URLをコピーしました

コメントを送る

コメントはブログオーナーのみ閲覧できます