以前、下の記事で、日付を比較する方法としてLocalDate#compareTo
を挙げました。
【Kotlin】日付を比較し、その差分を取得する - Qiita
しかし、日数の差分を取得する目的で利用しようとすると、場合によっては期待結果と異なることがわかったので備忘録として書いておきます。
LocalDate#compareTo
の中身を確認する
実際に比較が走っている箇所はこちらです↓
LocalDate
int compareTo0(LocalDate otherDate) {
int cmp = this.year - otherDate.year;
if (cmp == 0) {
cmp = this.month - otherDate.month;
if (cmp == 0) {
cmp = this.day - otherDate.day;
}
}
return cmp;
}
- まず
year
を比較する - その差がなければ
month
を比較する - さらに差がなければ
day
を比較する
という流れになっています。
つまり、日数の差分を比較・取得できるのは年数・月数が同じ場合に限定され、それ以外の場合は意図した結果とならないことがわかります。
実際に比較してみる
同じ年、同じ月、違う日の場合
val day1 = LocalDate.parse("2019-07-01")
val day2 = LocalDate.parse("2019-07-05")
val diffDay = day2.compareTo(day1) // diffDay: 4
→**「日数の差分」が取得できます。**
同じ年、違う月、違う日の場合
val day1 = LocalDate.parse("2019-07-01")
val day2 = LocalDate.parse("2019-08-05")
val diffMonth = day2.compareTo(day1) // diffMonth: 1
→月の比較が行われるため、「日数の差分」は取得できません。
違う年、違う月、違う日の場合
val day1 = LocalDate.parse("2017-07-01")
val day2 = LocalDate.parse("2019-08-05")
val diffYear = day2.compareTo(day1) // diffYear: 2
→年の比較が行われるため、「日数の差分」は取得できません。