kotlin - TzdbZoneRulesProvider 在 java.time 中不工作

标签 kotlin java-time threetenbp

我正在将旧代码库从 thirden 向后移植库迁移到使用 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")
    }
}

但是当我将 thirden 导入切换到 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>

我找不到任何可以解决此问题的内容。谁能帮我理解这里发生了什么?

最佳答案

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

The Java virtual machine has a default provider that provides zone rules for the time-zones defined by IANA Time Zone Database (TZDB). If the system property java.time.zone.DefaultZoneRulesProvider is defined then it is taken to be the fully-qualified name of a concrete ZoneRulesProvider class to be loaded as the default provider, using the system class loader. If this system property is not defined, a system-default provider will be loaded to serve as the default provider.

事实上,TzdbZoneRulesProviderjava.time.zone 中的包私有(private)类,因此您无论如何都无法访问它。

这本质上意味着您可以完全删除此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 .

关于kotlin - TzdbZoneRulesProvider 在 java.time 中不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75622472/

相关文章:

kotlin - Mockito:在Kotlin中模拟khttp对象

java - Android - 具有固定半径(以米为单位)的 Google Maps API 热图

java - org.gradle.execution.MultipleBuildFailures 使用@Query Room Persistence Library 时

java - ThreeTen toZonedDateTime : Exceptions when built by Ant

android - 如何保持按钮禁用任何editText为空?

java - 如何使用 DateTimeFormatter 解析非标准月份名称

java - 如何将时间从 GMT 转换为 EST

java - 将频率转换为 java.time.Period 类型

java - 如何修复 org. Threeten.bp.LocalDateTime 的 ClassNotFoundException?