- 投稿日:2019-06-07T02:13:18+09:00
【Kotlin】日付を比較し、その差分を取得する
今日の日付と他の日付を比較して差分を出したい、ということはよくあると思います。
例 - 今日;2019/06/07 - 他の日付: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型で取得します。ライブラリを導入するのは少し手間ですが、とてもシンプルなコードで差分を出すことができました
参考