using <, >, and == is not always the same as using .isBefore, .isAfter and isEqual when comparing ZonedDateTimes as shown by the following example in Kotlin:
import java.time.ZonedDateTime
import java.time.ZoneId
import java.time.ZoneOffset
fun main() {
val a = ZonedDateTime.of(2022, 1, 1, 13, 0, 0, 0, ZoneId.of("Europe/Oslo"))
val b = ZonedDateTime.of(2022, 1, 1, 12, 0, 0, 0, ZoneOffset.UTC)
println("a = $a")
println("b = $b")
println()
println("a < b: ${a < b}")
println("a > b: ${a > b}")
println("a == b: ${a == b}")
println()
println("a.isBefore(b): ${a.isBefore(b)}")
println("a.isAfter(b): ${a.isAfter(b)}")
println("a.isEqual(b): ${a.isEqual(b)}")
}
Output:
a = 2022-01-01T13:00 01:00[Europe/Oslo]
b = 2022-01-01T12:00Z
a < b: false
a > b: true
a == b: false
a.isBefore(b): false
a.isAfter(b): false
a.isEqual(b): true
What is the difference?
CodePudding user response:
The operators <
, >
, >=
, <=
all translate to compareTo
calls, and compareTo
does a subtly different thing from isBefore
and isAfter
.
compareTo
:
Compares this date-time to another date-time, including the chronology. The comparison is based first on the instant, then on the local date-time, then on the zone ID, then on the chronology. It is "consistent with equals", as defined by
Comparable
.
isBefore
:
Checks if the instant of this date-time is before that of the specified date-time.
Basically, compareTo
compares a lot more things. In other words, it has a lot more "tie-breakers". It even compares the chronology if it has to. On the other hand, isBefore
/isAfter
only compares the instants that the ZonedDateTime
s represents.
The two dates in question, 2022-01-01T13:00 01:00[Europe/Oslo] and 2022-01-01T12:00Z represents the same instant in time, so isBefore
and isAfter
both return false. On the other hand, compareTo
compares the local date times to break the tie. The local date time of 2022-01-01T13:00 01:00[Europe/Oslo] is later than that of 2022-01-01T12:00Z, so compareTo
thinks the former is "bigger".
A similar distinction exists between equals
(==
) and isEqual
- equals
compares a lot more than isEqual
.