web-dev-qa-db-ja.com

Three = Ten-BackportエラーAndroid-ZoneRulesException:タイムゾーンデータファイルが登録されていません

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()メソッドは、タイムゾーンを指定せずに機能します。

29
Matan Itzhak

Androidプロジェクトを使用する必要があります

_implementation 'com.jakewharton.threetenabp:threetenabp:1.0.3'
_

ライブラリのクラスを使用する前に、必ずAndroidThreeTen.init(this);を呼び出してください。これにより、タイムゾーンデータ(ライブラリに含まれる)が読み取られます。 [〜#〜] readme [〜#〜] で推奨されているように、ApplicationメソッドでonCreateクラスのライブラリを初期化できます。

59
LordRaydenMK

ライブラリを初期化する代わりに、これを試すことができます:

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()
0