我爲我的Android項目使用ThreeTen-Backport庫(因爲java.time還未在android開發中實現)。Android上的ThreeTen-Backport錯誤 - ZoneRulesException:沒有註冊時區數據文件
當我寫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,其他jar提示在classpath中可能有兩個或多個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()
方法應該沒有指定時區的工作。
謝謝,我的項目之前沒有應用程序類,所以我無法使用'AndroidThreeTen.init(this)''代碼。我想在活動的'onCreate'方法中加入這個,但是我看到它不正確。 現在我創建了一個新的類,它擴展了應用程序類並將該行放入'onCreate'方法中。現在一切正常! –
在onCreate中調用init違反了strictmode,甚至可能會延遲應用程序啓動。如果您異步調用init,則必須確保在完成之前不要使用它,這對於JUnit測試來說很難。 –
@ErikB它確實違反了嚴格模式,因爲它從資產中讀取時區文件,因此延遲了啓動時間。對於單元測試,你應該使用原始庫http://www.threeten.org/threetenbp/,因爲這裏有Android依賴關係,如https://github.com/JakeWharton/ThreeTenABP/issues/14 – LordRaydenMK