如何实现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
相关产品推荐
相关产品推荐

