4
6

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 5 years have passed since last update.

【Kotlin】LocalDateで2つの日付を比較し、日数の差分を取得する

Last updated at Posted at 2019-06-06

2つの日付を比較してその差分を取得したい、ということはよくあると思います。

例)
- 日付1:2019/06/07
- 日付2:2019/06/01
- 差分:6日

方法はいくつかあると思いますが、なるべくシンプルに書ける方法を模索しました。これはそのときのメモです。

ポイント

java.time.LocalDateではエラーが出る

java.time.LocalDateは、Java8からjava.timeパッケージに追加された日付を扱うAPIです。
これを使って今日の日付を取得しようとすると以下のように書きます。

val today = LocalDate.now()

しかしこれだとnow()の部分にエラーが表示されます。

Call requires API level 26 (current min is 15): java.time.LocalDate#now

このエラーはminSdkで26未満を設定している場合に表示されるもので、
java.time.LocalDateを使うためにはAndroidのAPI26(Android8.0/Oreo)以上が必要になるとこのこと。
大抵のアプリはまだAndroid5.0とか6.0くらいまではサポートしていると思うので、残念ながらこれは使えないケースが多そうです。

ThreeTenABPライブラリを使う

そこで、代わりにThreeTenABPを使います。
ThreeTenABPはざっくり言うと、java.time.LocalDateなどの新しいAPIをAndroidでも問題なく使えるようにバックポートしたライブラリです。作者はわれらがJake神。

詳細は下記を参照してください。
GitHub - JakeWharton/ThreeTenABP: An adaptation of the JSR-310 backport for Android.

コード

前置きが長くなりましたが、**ThreeTenABPのLocalDate**を使って日付の差分を取得します。

ThreeTenABPの導入

build.gradleに下記を追加。

implementation 'com.jakewharton.threetenabp:threetenabp:1.2.1'

ApplicationクラスのonCreate()内で初期化します。

class Application : Application() {

    override fun onCreate() {
        super.onCreate()
        // 初期化
        AndroidThreeTen.init(this)
    }
}

AndroidManifestのapplicationタグ内に下記を追加。

<application
    android:name=".Application"
</application>

ここまで完了すると、java.time.LocalDateの他にorg.threeten.bp.LocalDateも選択肢に表示されるようになります。
スクリーンショット 2019-06-07 1.27.58.png

差分の取得

val today = LocalDate.now() //2019-06-07
val day1 = LocalDate.parse("2019-06-01")

val diff = today.compareTo(day1) //6(Int)

LocalDate.now()でLocalDate型の現在日付を取得。
LocalDate.parse("2019-06-01")は、引数で指定した文字列をもとにLocalDateクラスのインスタンスを返します。
最後にtoday.compareTo(day1)で2つのLocalDate型を比較し、差分をInt型で取得します。

ライブラリを導入するのは少し手間ですが、とてもシンプルなコードで差分を出すことができました:tada:

追記(2019/07/28)

:warning:注意
日数の差分を取得する目的で利用しようとすると、場合によっては期待結果と異なることがあります。
詳細は下記にまとめましたのでご覧ください。
【Android】LocalDate#compareToで日付を比較する際の注意点

参考

4
6
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
4
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?