You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现Kotlin Duration的截断功能?

Kotlin Duration 实现截断扩展函数

Java 中的 Duration 截断能力

Java 的 Duration 类自带截断功能,示例代码如下:

Duration d = myDuration.truncatedTo(ChronoUnit.SECONDS);

public Duration truncatedTo​(TemporalUnit unit)
返回此 Duration 的副本,截断至指定单位。
截断操作会生成原始值的副本,其中所有小于指定单位的时间字段都会被设为零。例如,用 MINUTES 单位截断时,会向下取整到最近的分钟数,同时将秒和纳秒置为零。

Kotlin 中自定义截断扩展函数

Kotlin 的 Duration 采用独立实现逻辑,没有内置的截断方法。我们可以通过扩展函数实现类似功能,对经过乘除运算后的 Duration 移除所有小于指定单位的时间部分。完整示例代码如下:

import kotlin.time.*
import kotlin.time.Duration.Companion.days
import kotlin.time.Duration.Companion.hours
import kotlin.time.Duration.Companion.minutes

fun main() {
   val duration = 10.days + 5.hours + 33.minutes
   println(duration)

   val divided = duration / 100.001
   println(divided)

   val truncatedToSeconds = divided.truncate(DurationUnit.SECONDS)
   println(truncatedToSeconds) // 预期输出: 2h 27m 19s
   
   val truncatedToMinutes = divided.truncate(DurationUnit.MINUTES)
   println(truncatedToMinutes) // 预期输出: 2h 27m

   val truncatedToHours = divided.truncate(DurationUnit.HOURS)
   println(truncatedToHours) // 预期输出: 2h
}

fun Duration.truncate(unit: DurationUnit): Duration {
    val unitNanoseconds = unit.toDuration(1).inWholeNanoseconds
    val totalNanoseconds = this.inWholeNanoseconds
    val truncatedNanoseconds = totalNanoseconds / unitNanoseconds * unitNanoseconds
    return Duration.ofNanoseconds(truncatedNanoseconds)
}

实现逻辑说明

核心思路是将 Duration 统一转换为纳秒级总时长,通过整除指定单位的纳秒长度,得到该单位的整数倍时长,再转换回 Duration 对象,以此实现向下截断到指定单位的效果。

内容的提问来源于stack exchange,提问作者aSemy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 16:40:53