我在我的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()
方法无需指定时区即可使用。
答案 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