Я использую библиотеку ThreeTen-Backport для своего Android-проекта (потому что java.time еще не реализован в разработке Android).Ошибка в ThreeTen-Backport для Android - 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.
Я искал возможное решение, но не смог найти что-либо полезное: было предложено одно решение: мне нужно использовать другую банку, которая включает в себя правила часовых поясов, и другие предположили, что в пути к классам могут быть две или более библиотеки 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'. Теперь все работает просто отлично! –
Вызов init в onCreate нарушает строгий режим и может даже задержать запуск приложения. Если вы вызываете init асинхронно, вы должны не использовать его до тех пор, пока он не завершится, что может быть сложно для тестирования JUnit. –
@ErikB нарушает строгий режим, потому что он считывает файл часовых поясов из активов, поэтому он задерживает время запуска. Для модульных тестов вы должны использовать оригинальную библиотеку http://www.threeten.org/threetenbp/, потому что у этого есть зависимости от Android, как описано здесь https://github.com/JakeWharton/ThreeTenABP/issues/14 – LordRaydenMK