Never compare dates in Elixir using "<" or ">"

For the examples in this article I use the data structure Date. The same applies for DateTime or NaiveDateTime

Consider this:

early_june = ~D[2017-06-01]
late_june = ~D[2017-06-30]

How do you find out what's earlier?

The naive approach is to use the comparison operator <:

early_june < late_june
# => true

That works. But this is tricky. It only works in some cases.

Now consider this:

late_june = ~D[2017-06-30]
early_july = ~D[2017-07-01]

What do you think the output is now?

late_june < early_july
# => false

Turns out: comparison with < (or >) just compares the struct fields (as the current version of the documentation states. My best guess is for same reason the day field has higher priority than the month field so this comparison fail sometimes.

To solve this use the compare function of the according modules:

Date.compare(late_june, early_july) == :lt
# => true