3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Android】LocalDate#compareToで日付を比較する際の注意点

Last updated at Posted at 2019-07-28

以前、下の記事で、日付を比較する方法として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

→年の比較が行われるため、「日数の差分」は取得できません。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?