Android上的ThreeTen-Backport错误 - ZoneRulesException:未注册任何时区数据文件

时间:2016-07-09 12:29:48

标签: java android exception jsr310 threetenbp

我在我的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项目中运行良好,该项目使用本机java.time库。

我搜索了一个可能的解决方案,但找不到任何有用的东西:一个解决方案建议我需要使用另一个包含时区规则的jar,另一个建议我可能有两个或更多个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()方法无需指定时区即可使用。

4 个答案:

答案 0 :(得分:51)

对于Android项目,您应该使用

#leftArrow{
position: absolute; 
left: -40px; 
top: 50%;
}

确保在使用库中的类之前调用​​compile 'com.jakewharton.threetenabp:threetenabp:1.0.3' 。这将读取时区数据(包含在库中)。您可以使用AndroidThreeTen.init(this);方法在Application类中初始化库,就像README中建议的那样。

答案 1 :(得分:1)

对我来说,它不能在启用了proguard的情况下进行签名发行。检查您的proguard规则是否包含

-keep class org.threeten.bp.zone.*

除非添加。它对我有帮助。

答案 2 :(得分:0)

您可以尝试这样做,而不是初始化库:

<强> LocalDateEx.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)

<强> LocalTimeEx.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)

<强> LocalDateTimeEx.kt

   val today=LocalDateEx.getNow()
   val today2=LocalTimeEx.getNow()
   val today3=LocalDateTimeEx.getNow()

用法:

{{1}}

答案 3 :(得分:0)

AGP 4.0 现在支持 Java 8 Desugar API,请参见此处:https://developer.android.com/studio/write/java8-support

因此您可以使用 java.time. 而无需使用向后移植的版本

注意:

如果您尝试支持低于 21 的 API,仍然存在问题(由 minSdk 21 解决)

https://github.com/google/bundletool/issues/182#issuecomment-753269941