首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在ThreeTenABP中解决ExceptionInInitializerError和ZoneRulesException?

如何在ThreeTenABP中解决ExceptionInInitializerError和ZoneRulesException?
EN

Stack Overflow用户
提问于 2019-06-25 11:00:51
回答 1查看 262关注 0票数 2

我正在尝试将服务器时间(GMT+09:00)转换为本地时间(客户端的任何区域)。

我试过java.time了。但是,它至少需要minSdk API26。然后,我寻找了另一种方法

因此,我使用了ThreeTenABP库。

我得到了这个例外。

代码语言:javascript
复制
java.lang.ExceptionInInitializerError
        at org.threeten.bp.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:121)
        at org.threeten.bp.ZoneRegion.ofId(ZoneRegion.java:143)
        at org.threeten.bp.ZoneId.of(ZoneId.java:358)

在适配器的onBindViewHolder()中。

代码语言:javascript
复制
        val item = datas?.get(position)

        AndroidThreeTen.init(context)

        val checkedDate = item?.datetime
        val serverTimeZone = ZoneId.of("Asia/Tokyo")
        val serverFormatter = DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss")
        val clientTimeZone = ZoneId.systemDefault()

        val serverDateTime = LocalDateTime.parse(checkedDate, serverFormatter).atZone(serverTimeZone)
        val clientDateTime = serverDateTime.withZoneSameInstant(clientTimeZone)

另外,它似乎没有提供所有的时区。如果我查看ZoneId,我会看到以下内容:

代码语言:javascript
复制
    static {
        Map<String, String> base = new HashMap();
        base.put("ACT", "Australia/Darwin");
        base.put("AET", "Australia/Sydney");
        base.put("AGT", "America/Argentina/Buenos_Aires");
        base.put("ART", "Africa/Cairo");
        base.put("AST", "America/Anchorage");
        base.put("BET", "America/Sao_Paulo");
        base.put("BST", "Asia/Dhaka");
        base.put("CAT", "Africa/Harare");
        base.put("CNT", "America/St_Johns");
        base.put("CST", "America/Chicago");
        base.put("CTT", "Asia/Shanghai");
        base.put("EAT", "Africa/Addis_Ababa");
        base.put("ECT", "Europe/Paris");
        base.put("IET", "America/Indiana/Indianapolis");
        base.put("IST", "Asia/Kolkata");
        base.put("JST", "Asia/Tokyo");
        base.put("MIT", "Pacific/Apia");
        base.put("NET", "Asia/Yerevan");
        base.put("NST", "Pacific/Auckland");
        base.put("PLT", "Asia/Karachi");
        base.put("PNT", "America/Phoenix");
        base.put("PRT", "America/Puerto_Rico");
        base.put("PST", "America/Los_Angeles");
        base.put("SST", "Pacific/Guadalcanal");
        base.put("VST", "Asia/Ho_Chi_Minh");
        base.put("EST", "-05:00");
        base.put("MST", "-07:00");
        base.put("HST", "-10:00");
        SHORT_IDS = Collections.unmodifiableMap(base);
    }

因此,当我在韩国首尔(“亚洲/首尔”)或base地图不包括的其他地方时,我不知道它是否正常工作。如果我删除AndroidThreeTen.init(context),我会得到如下结果:

代码语言:javascript
复制
org.threeten.bp.zone.ZoneRulesException: No time-zone data files registered
        at org.threeten.bp.zone.ZoneRulesProvider.getProvider(ZoneRulesProvider.java:165)
        at org.threeten.bp.zone.ZoneRulesProvider.getRules(ZoneRulesProvider.java:122)
        at org.threeten.bp.ZoneRegion.ofId(ZoneRegion.java:143)
        at org.threeten.bp.ZoneId.of(ZoneId.java:358)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-25 11:10:05

您需要在应用程序onCreate()方法中调用AndroidThreeTen.init(context),而不是在onBindViewHolder()

代码语言:javascript
复制
class MyApp : Application() {

    override fun onCreate() {
        super.onCreate()

        AndroidThreeTen.init(this@App)
    }
}

请记住将您的应用程序注册到清单

代码语言:javascript
复制
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.example.app">

    <application
            android:name=".MyApp"
                <!-- .... -->
            >

    </application>

</manifest>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56746279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档