AndroidプロジェクトにThreeTen-Backportライブラリを使用しています(Java.timeがAndroid開発でまだ実装されていないため)。
LocalDate today=LocalDate.now();
またはLocalTime time=LocalTime.now();
と書くと、次の例外が発生します。
_Caused by: org.threeten.bp.zone.ZoneRulesException:
No time-zone data files registered
at org.threeten.bp.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.Java:176)
at org.threeten.bp.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.Java:133)
at org.threeten.bp.ZoneRegion.ofId(ZoneRegion.Java:143)
at org.threeten.bp.ZoneId.of(ZoneId.Java:357)
at org.threeten.bp.ZoneId.of(ZoneId.Java:285)
at org.threeten.bp.ZoneId.systemDefault(ZoneId.Java:244)
at org.threeten.bp.Clock.systemDefaultZone(Clock.Java:137)
at org.threeten.bp.LocalDate.now(LocalDate.Java:165)
_
同じコード行は、ネイティブJava.timeライブラリを使用する別のJavaプロジェクトでうまく機能します。
考えられる解決策を検索しましたが、有用なものが見つかりませんでした:ある解決策では、タイムゾーンルールを含む別のjarを使用する必要があることを提案し、別の解決策では、クラスパス内に2つ以上のThreeTenBPライブラリがあることを提案しました。
これらのケースは私のケースと一致しません。
_build.gradle
_ファイル内の依存関係セクションで、いくつかの構成を試しました。
compile 'com.jakewharton.threetenabp:threetenabp:1.0.3'
_を使用しましたcompile 'org.threeten:threetenbp:1.0.3'
_compile 'org.threeten:threetenbp:1.3.1'
_compile 'org.threeten:threetenbp:1.3.2'
_を使用していますそのコード行の何が問題で、どのように修正するのかわかりません。
_LocalDate.now()
およびLocalTime.now()
メソッドは、タイムゾーンを指定せずに機能します。
Androidプロジェクトを使用する必要があります
_implementation 'com.jakewharton.threetenabp:threetenabp:1.0.3'
_
ライブラリのクラスを使用する前に、必ずAndroidThreeTen.init(this);
を呼び出してください。これにより、タイムゾーンデータ(ライブラリに含まれる)が読み取られます。 [〜#〜] readme [〜#〜] で推奨されているように、Application
メソッドでonCreate
クラスのライブラリを初期化できます。
ライブラリを初期化する代わりに、これを試すことができます:
LocalDateEx.kt
object LocalDateEx {
/**an alternative of LocalDate.now(), as it requires initialization using AndroidThreeTen.init(context), which takes a bit time (loads a file)*/
@JvmStatic
fun getNow(): LocalDate = Calendar.getInstance().toLocalDate()
}
fun Calendar.toLocalDate(): LocalDate = LocalDate.of(get(Calendar.YEAR), get(Calendar.MONTH) + 1, get(Calendar.DAY_OF_MONTH))
LocalTimeEx.kt
object LocalTimeEx {
/**an alternative of LocalDateTime.now(), as it requires initialization using AndroidThreeTen.init(context), which takes a bit time (loads a file)*/
@JvmStatic
fun getNow(): LocalTime = Calendar.getInstance().toLocalTime()
}
fun Calendar.toLocalTime(): LocalTime = LocalTime.of(get(Calendar.HOUR_OF_DAY), get(Calendar.MINUTE), get(Calendar.SECOND), get(Calendar.MILLISECOND) * 1000000)
LocalDateTimeEx.kt
object LocalDateTimeEx {
/**an alternative of LocalDateTime.now(), as it requires initialization using AndroidThreeTen.init(context), which takes a bit time (loads a file)*/
@JvmStatic
fun getNow(): LocalDateTime = Calendar.getInstance().toLocalDateTime()
}
private fun Calendar.toLocalDateTime(): LocalDateTime = LocalDateTime.of(get(Calendar.YEAR), get(Calendar.MONTH) + 1, get(Calendar.DAY_OF_MONTH), get(Calendar.HOUR_OF_DAY), get(Calendar.MINUTE), get(Calendar.SECOND),
get(Calendar.MILLISECOND) * 1000000)
使用法:
val today=LocalDateEx.getNow()
val today2=LocalTimeEx.getNow()
val today3=LocalDateTimeEx.getNow()