java - Error de ThreeTen-Backport en Android-ZoneRulesException: no se han registrado archivos de datos de zona horaria
jsr310 threetenbp (2)
Estoy usando la biblioteca ThreeTen-Backport para mi proyecto de Android (porque java.time aún no está implementado en el desarrollo de Android).
Cuando escribo LocalDate today=LocalDate.now();
o LocalTime time=LocalTime.now();
Me sale la siguiente excepción:
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)
La misma línea de código funciona bien en otro proyecto java que tengo, que usa la biblioteca nativa java.time.
Busqué una posible solución, pero no encontré nada útil: una solución sugirió que necesitaba usar otro jar que incluye las reglas de zona horaria y otra sugirió que podría haber dos o más bibliotecas ThreeTenBP dentro del classpath.
Esos casos no coinciden con mi caso.
Dentro del archivo build.gradle
, en la sección de dependencias, he intentado algunas configuraciones:
- Al principio, utilicé -
compile ''com.jakewharton.threetenabp:threetenabp:1.0.3''
- Entonces, probé -
compile ''org.threeten:threetenbp:1.0.3''
- Después de eso, intenté
compile ''org.threeten:threetenbp:1.3.1''
- Actualmente, uso
compile ''org.threeten:threetenbp:1.3.2''
No sé qué está mal con esa línea de código y cómo solucionarlo.
Los LocalDate.now()
y LocalTime.now()
deberían funcionar sin especificar una zona horaria.
En lugar de la inicialización de la biblioteca, puede intentar esto:
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)
Uso:
val today=LocalDateEx.getNow()
val today2=LocalTimeEx.getNow()
val today3=LocalDateTimeEx.getNow()
Para el proyecto de Android debes usar
compile ''com.jakewharton.threetenabp:threetenabp:1.0.3
Asegúrese de llamar a AndroidThreeTen.init(this);
Antes de utilizar las clases de la biblioteca. Esto leerá los datos de las zonas horarias (incluidos en la biblioteca). Puede inicializar la biblioteca en su clase de Application
en el método onCreate
tal como se recomienda en README .