首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >三次- Android -ZoneRulesException上的Backport错误:没有已注册的时区数据文件

三次- Android -ZoneRulesException上的Backport错误:没有已注册的时区数据文件
EN

Stack Overflow用户
提问于 2016-07-09 12:29:48
回答 5查看 19K关注 0票数 52

我在我的安卓项目中使用了ThreeTen库(因为java.time还没有在Android开发中实现)。

当我编写LocalDate today=LocalDate.now();LocalTime time=LocalTime.now();时,会得到以下异常:

代码语言:javascript
复制
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,而另一个则建议在类路径中可能有两个或更多的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()方法应该在不指定时区的情况下工作。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-07-09 12:38:04

对于Android项目,您应该使用

代码语言:javascript
复制
implementation 'com.jakewharton.threetenabp:threetenabp:1.0.3'

在使用库中的类之前,请确保调用AndroidThreeTen.init(this);。这将读取时区数据(包括在库中)。您可以在Application类中在onCreate方法中初始化库,就像自述文件中推荐的那样。

票数 112
EN

Stack Overflow用户

发布于 2018-03-22 12:38:10

与其初始化库,不如尝试如下:

LocalDateEx.kt

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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)

用法:

代码语言:javascript
复制
   val today=LocalDateEx.getNow()
   val today2=LocalTimeEx.getNow()
   val today3=LocalDateTimeEx.getNow()
票数 2
EN

Stack Overflow用户

发布于 2020-02-28 09:42:42

对我来说,它并不是在启用proguard的情况下进行签名发布构建的。检查你的护卫规则是否包含

代码语言:javascript
复制
-keep class org.threeten.bp.zone.*

除非加进去。这对我有帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38281808

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档