我在我的安卓项目中使用了ThreeTen库(因为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,而另一个则建议在类路径中可能有两个或更多的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()方法应该在不指定时区的情况下工作。
发布于 2016-07-09 12:38:04
对于Android项目,您应该使用
implementation 'com.jakewharton.threetenabp:threetenabp:1.0.3'在使用库中的类之前,请确保调用AndroidThreeTen.init(this);。这将读取时区数据(包括在库中)。您可以在Application类中在onCreate方法中初始化库,就像自述文件中推荐的那样。
发布于 2018-03-22 12:38:10
与其初始化库,不如尝试如下:
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()发布于 2020-02-28 09:42:42
对我来说,它并不是在启用proguard的情况下进行签名发布构建的。检查你的护卫规则是否包含
-keep class org.threeten.bp.zone.*除非加进去。这对我有帮助。
https://stackoverflow.com/questions/38281808
复制相似问题