20190607のKotlinに関する記事は1件です。

【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も選択肢に表示されるようになります。
スクリーンショット 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:

参考

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む