我可以得到一个固定的时钟在kotlinx时间?

ss2ws0br  于 2023-02-13  发布在  Kotlin
关注(0)|答案(1)|浏览(146)

我尝试将代码转换为使用kotlinx.datetime而不是java.time库,因为我希望利用kotlinx库的序列化优势(它可以使用@Serialize注解序列化instant)。
然而,我有一些测试使用了java.time.Clock,虽然有一个kotlinx.datetime.Clock类,但它似乎比java类更受限制。
是否有一种方法可以实现与此相同的功能(使用java.time.Clockjava.time.Instant):

val clockFixed = Clock.fixed(Instant.now().minusMillis(1000), ZONE_ID_UTC)

使用kotlinx库?它不需要完全相同,但是我想要一个时钟,总是返回相同的时刻,这样我就可以使用它进行测试和生产代码。

0qx6xfy6

0qx6xfy61#

kotlinx.datetime.Clock是一个非常简单的接口,它(从0.4.0版本开始)只包含一个函数声明。

/**
 * A source of [Instant] values.
 *
 * See [Clock.System][Clock.System] for the clock instance that queries the operating system.
 */
public interface Clock {
    /**
     * Returns the [Instant] corresponding to the current time, according to this clock.
     */
    public fun now(): Instant

    ...
}

0.4.0开始,库本身没有提供Fixed时钟的实现,但是,您可以轻松地提供自己的Fixed时钟实现,并使其在Clock接口的companion object上可用。

public class FixedClock(private val fixedInstant: Instant): Clock {
    override fun now(): Instant = fixedInstant
}

private fun Clock.Companion.Fixed(fixedInstant: Instant): Clock = FixedClock(fixedInstant)

然后,您可以像使用库提供的官方System时钟一样使用它。

val systemClock: Clock = Clock.System
val fixedClock: Clock = Clock.Fixed(...)

相关问题