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
も選択肢に表示されるようになります。
差分の取得
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型で取得します。
ライブラリを導入するのは少し手間ですが、とてもシンプルなコードで差分を出すことができました
追記(2019/07/28)
注意
日数の差分を取得する目的で利用しようとすると、場合によっては期待結果と異なることがあります。
詳細は下記にまとめましたのでご覧ください。
【Android】LocalDate#compareToで日付を比較する際の注意点