[Android]「ThreeTenABP」 日付時刻関連を簡単に扱えるライブラリ

このライブラリなんで誰も教えてくれなかったの・・・?

超便利じゃんか!って思いました。

今まで一生懸命Calenderクラスとかで日付比較してたよ!

今まで既存アプリとか結構改修とかしてるけど、このライブラリには出会わなかった・・・。

ということでライブラリを紹介します。

スポンサーリンク

ThreeTenABPって?

Java8から導入されたDate and Time API(JSR-310)を参照実装したものをAndroidで利用可能なようにバックポートしたもの。 ABPはAndroid Backportの略。

基礎のJava知識が皆無な自分にとってJava8とか言われてもいまいちピンとこないけど(マテコラ)、日付系の最新のAPIが使えるってことですね。

OS8系からとかはJava8のAPI使えるっぽい雰囲気するけど8系未満を切るのは冒険がすぎるw

ライブラリの作成者は神様Jake Whartonです。これは使うしか無いw

導入方法

build.gradleのdependenciesに以下を追加

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

ApplicationクラスのonCreate()でタイムゾーン情報を初期化を初期化する

AndroidThreeTen.init(this)

LocalDateクラス

日付に関する情報を扱うクラス。

年月日が取得できる

年月日取得

// 今日の日付を取得する
val todayDate = LocalDate.now()
Timber.d("todayDate: $todayDate")
val year = todayDate.year
Timber.d("todayDate: year $year")
val monthValue = todayDate.monthValue
Timber.d("todayDate: monthValue $monthValue")
val dayOfMonth = todayDate.dayOfMonth
Timber.d("todayDate: dayOfMonth $dayOfMonth")
val dayOfWeek = todayDate.dayOfMonth
Timber.d("todayDate: dayOfWeek $dayOfWeek")

出力結果

todayDate: 2019-06-15(HogeActivity.kt:36)
todayDate: year 2019(HogeActivity.kt:38)
todayDate: monthValue 6(HogeActivity.kt:40)
todayDate: dayOfMonth 15(HogeActivity.kt:42)
todayDate: dayOfWeek 15(HogeActivity.kt:44)

フォーマット

val formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日")
val formatted = todayDate.format(formatter)
Timber.d("formatted: $formatted")

出力結果

formatted: 2019年06月15日(HogeActivity.kt:48)

年月日の加算/減算

val oneYearAgo = todayDate.minusYears(1)
Timber.d("oneYearAgo: $oneYearAgo")
val oneYearLater = todayDate.plusYears(1)
Timber.d("oneYearLater: $oneYearLater")
val oneMonthAgo = todayDate.minusMonths(1)
Timber.d("oneMonthAgo: $oneMonthAgo")
val oneMonthLater = todayDate.plusMonths(1)
Timber.d("oneMonthLater: $oneMonthLater")
val oneWeekAgo = todayDate.minusWeeks(1)
Timber.d("oneWeekAgo: $oneWeekAgo")
val oneWeekLater = todayDate.plusWeeks(1)
Timber.d("oneWeekLater: $oneWeekLater")
val oneDayAgo = todayDate.minusDays(1)
Timber.d("oneDayAgo: $oneDayAgo")
val oneDayLater = todayDate.plusDays(1)
Timber.d("oneDayLater: $oneDayLater")

出力結果

oneYearAgo: 2018-06-15(HogeActivity.kt:51)
oneYearLater: 2020-06-15(HogeActivity.kt:53)
oneMonthAgo: 2019-05-15(HogeActivity.kt:55)
oneMonthLater: 2019-07-15(HogeActivity.kt:57)
oneWeekAgo: 2019-06-08(HogeActivity.kt:59)
oneWeekLater: 2019-06-22(HogeActivity.kt:61)
oneDayAgo: 2019-06-14(HogeActivity.kt:63)
oneDayLater: 2019-06-16(HogeActivity.kt:65)

LocalTimeクラス

時刻に関する情報を扱うクラス。

msecまで取得できる。

時刻取得

// 現在の時刻を取得する
val localTime = LocalTime.now()
Timber.d("localTime: $localTime")
val hour = localTime.hour
Timber.d("localTime: hour $hour")
val minute = localTime.minute
Timber.d("localTime: minute $minute")
val second = localTime.second
Timber.d("localTime: second $second")
val nano = localTime.nano
Timber.d("localTime: nano $nano")

出力結果

localTime: 21:25:30.145(HogeActivity.kt:71)
localTime: hour 21(HogeActivity.kt:73)
localTime: minute 25(HogeActivity.kt:75)
localTime: second 30(HogeActivity.kt:77)
localTime: nano 145000000(HogeActivity.kt:79)

フォーマット

val formatter = DateTimeFormatter.ofPattern("HH時mm分ss.SSS秒")
val formatted = localTime.format(formatter)
Timber.d("formatted: $formatted")

出力結果

formatted: 21時25分30.145秒(HogeActivity.kt:84)

時刻の加算/減算

val oneMinutesAgo = localTime.minusMinutes(1)
Timber.d("oneMinutesAgo: $oneMinutesAgo")
val oneMinutesLater = localTime.plusMinutes(1)
Timber.d("oneMinutesLater: $oneMinutesLater")
val oneSecondsAgo = localTime.minusSeconds(1)
Timber.d("oneSecondsAgo: $oneSecondsAgo")
val oneSecondsLater = localTime.plusSeconds(1)
Timber.d("oneSecondsLater: $oneSecondsLater")
val oneNanosAgo = localTime.minusNanos(1)
Timber.d("oneNanosAgo: $oneNanosAgo")
val oneNanosLater = localTime.plusNanos(1)
Timber.d("oneNanosLater: $oneNanosLater")

出力結果

oneHourAgo: 20:25:30.145(HogeActivity.kt:86)
oneHourLater: 22:25:30.145(HogeActivity.kt:88)
oneMinutesAgo: 21:24:30.145(HogeActivity.kt:92)
oneMinutesLater: 21:26:30.145(HogeActivity.kt:94)
oneSecondsAgo: 21:25:29.145(HogeActivity.kt:96)
oneSecondsLater: 21:25:31.145(HogeActivity.kt:98)
oneNanosAgo: 21:25:30.144999999(HogeActivity.kt:100)
oneNanosLater: 21:25:30.145000001(HogeActivity.kt:102)

LocalDateTimeクラス

日付と時刻に関する情報を扱うクラス。

全部のせ的な?w

日付と時刻取得

// 現在の日付と時刻を取得する
val localDateTime = LocalDateTime.now()
Timber.d("localDateTime: $localDateTime")

出力結果

localDateTime: 2019-06-15T21:25:30.225(HogeActivity.kt:108)

加算/減算

val oneYearAndHourAgo = localDateTime.minusYears(1).minusHours(1)
Timber.d("oneYearAndHourAgo: $oneYearAndHourAgo")
val oneYearAndHourLater = localDateTime.plusYears(1).plusHours(1)
Timber.d("oneYearAndHourLater: $oneYearAndHourLater")

出力結果

localDateTime: 2019-06-15T21:25:30.225(HogeActivity.kt:108)
oneYearAndHourAgo: 2018-06-15T20:25:30.225(HogeActivity.kt:111)
oneYearAndHourLater: 2020-06-15T22:25:30.225(HogeActivity.kt:113)

Durationクラス

対象の日付等の比較を行ってくれる

時間比較

val from = LocalDateTime.of(2019, 6, 15, 16, 30, 30)
val to = LocalDateTime.of(2019, 6, 15, 23, 30, 30)
val duration = Duration.between(from, to)
val durationHours = duration.toHours()
Timber.d("durationHours: $durationHours")

出力結果

durationHours: 7(HogeActivity.kt:120)

おわりに

このライブラリを使用することでものすごく直感的に日付関連の処理が作れるようになると思う。

今後そのへんの処理を作るときはこのライブラリを使っていこうと思う。

タイトルとURLをコピーしました