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

Mat*_*hak 33 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)
Run Code Online (Sandbox Code Playgroud)

相同的代码行在我使用的另一个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()方法应该工作而没有指定时区.

Lor*_*nMK 66

对于Android项目,您应该使用

implementation 'com.jakewharton.threetenabp:threetenabp:1.0.3'
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,我的项目以前没有应用程序类,所以我无法使用`AndroidThreeTen.init(this);`代码.我想在活动的'onCreate`方法中添加它,但我看到它不对.现在我创建了一个新类,它扩展了应用程序类,并将该行放在`onCreate`方法中.现在一切都很棒! (7认同)
  • @ErikB它确实违反严格模式,因为它从资产中读取时区文件,因此它会延迟启动时间.对于单元测试,您应该使用原始库http://www.threeten.org/threetenbp/,因为这个具有Android依赖关系,如此处所述https://github.com/JakeWharton/ThreeTenABP/issues/14 (6认同)
  • 你没有。您只需为单元测试添加原始测试(`testImplementation`)就可以了 (3认同)
  • 如何在单元测试中初始化该库? (2认同)