代码之家  ›  专栏  ›  技术社区  ›  AndroidDev

TzdbZoneRulesProvider在java.time中不工作

  •  0
  • AndroidDev  · 技术社区  · 1 年前

    我正在将旧的代码库从 threeten 要使用的后台端口库 java.time 相反有一种测试方法不再有效,但我不知道如何修复它。

    这是课程 之前 这些变化。这将正确编译:

    import androidx.arch.core.executor.testing.InstantTaskExecutorRule
    import org.junit.Before
    import org.junit.Rule
    import org.threeten.bp.ZoneId
    import org.threeten.bp.zone.TzdbZoneRulesProvider
    import org.threeten.bp.zone.ZoneRulesProvider
    
    open class BaseAvailabilityTest {
    
        @get:Rule
        val rule = InstantTaskExecutorRule()
    
        @Before
        open fun setUp() {
            if (ZoneRulesProvider.getAvailableZoneIds().isEmpty()) {
                val stream = this.javaClass.classLoader?.getResourceAsStream("TZDB.dat")
                stream.use(::TzdbZoneRulesProvider).apply {
                    ZoneRulesProvider.registerProvider(this)
                }
            }
            zoneId = ZoneId.of("America/Los_Angeles")
        }
    }
    

    但当我切换 十分之三 进口到 java.time 这样地:

    import java.time.ZoneId
    import java.time.zone.TzdbZoneRulesProvider
    import java.time.zone.ZoneRulesProvider
    

    则Android Studio显示错误:

    Type mismatch
    Required: (TypeVariable(T))->TypeVariable(R)
    Found: KFunction0<TzdbZoneRulesProvider>
    

    我找不到任何能解决这个问题的东西。有人能帮我了解这里发生了什么吗?

    1 回复  |  直到 1 年前
        1
  •  2
  •   Sweeper    1 年前

    您不需要显式注册tzdb提供程序。这是JVM的默认提供程序,如中所述 JavaDocs .

    Java虚拟机有一个默认提供程序,它为IANA时区数据库(TZDB)定义的时区提供区域规则。如果定义了系统属性java.time.zone.DefaultZoneRulesProvider,则使用系统类加载器将其视为要作为默认提供程序加载的具体ZoneRulesProvider类的完全限定名称。如果未定义此系统属性,则将加载系统默认提供程序作为默认提供程序。

    事实上 TzdbZoneRulesProvider 是中的包私人类 java.time.zone ,所以您无论如何都无法访问它。

    这基本上意味着您可以删除 if 完全:

    if (ZoneRulesProvider.getAvailableZoneIds().isEmpty()) {
        val stream = this.javaClass.classLoader?.getResourceAsStream("TZDB.dat")
        stream.use(::TzdbZoneRulesProvider).apply {
            ZoneRulesProvider.registerProvider(this)
        }
    }
    

    如果您的测试依赖于特定版本的tzdb(例如在非常罕见的情况下 this post ),您可以使用 timezone updater tool 以更改JDK中的tzdb版本。描述了一个示例 here .