ThreeTen-Backport error on Android - ZoneRulesException: No time-zone data files registered

前端 未结 3 1220
太阳男子
太阳男子 2020-12-03 04:04

I\'m using ThreeTen-Backport library for my Android project (because java.time is not yet implemented in android development).

When I write LocalDate today=L

相关标签:
3条回答
  • 2020-12-03 04:45

    Instead of initialization of the library, you can try this:

    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)
    

    Usage:

       val today=LocalDateEx.getNow()
       val today2=LocalTimeEx.getNow()
       val today3=LocalDateTimeEx.getNow()
    
    0 讨论(0)
  • 2020-12-03 05:00

    For Android project you should use

    implementation 'com.jakewharton.threetenabp:threetenabp:1.0.3'
    

    Make sure you call AndroidThreeTen.init(this); before using the classes from the library. This will read the time zones data (included in the library). You can initialize the library in your Application class in the onCreate method just like it is recommended in the README.

    0 讨论(0)
  • 2020-12-03 05:04

    For me, it wasn't working on signed release build with proguard enabled. Check your proguard rules if they contain

    -keep class org.threeten.bp.zone.*
    

    unless, add it. It helped for me.

    0 讨论(0)
提交回复
热议问题