Kotlin中计算时间字符串与当前时间间隔的正确简便方法
Kotlin计算指定时间与当前时间的间隔并格式化输出
可靠实现方案(基于Java Time API)
直接使用Java 8引入的java.time包(Kotlin可无缝调用),这套API线程安全、设计严谨,完全替代旧的Date/Calendar类,能避免旧API的诸多漏洞。
完整代码示例
import java.time.LocalDateTime import java.time.LocalTime import java.time.Duration fun getTimeUntilTarget(targetTimeStr: String): String { // 解析目标时间字符串(支持"HH:mm:ss"格式,符合ISO标准) val targetTime = LocalTime.parse(targetTimeStr) val now = LocalDateTime.now() // 构造当天的目标时间点,若已过则顺延至次日 var targetDateTime = LocalDateTime.of(now.toLocalDate(), targetTime) if (targetDateTime.isBefore(now)) { targetDateTime = targetDateTime.plusDays(1) } // 计算时间间隔 val duration = Duration.between(now, targetDateTime) // Java 9+ 可用toHoursPart()/toMinutesPart(),Java 8用下方注释的替代写法 val hours = duration.toHoursPart() val minutes = duration.toMinutesPart() // Java 8兼容写法: // val totalMinutes = duration.toMinutes() // val hours = totalMinutes / 60 // val minutes = totalMinutes % 60 // 格式化输出,处理单复数 return buildString { when { hours > 0 && minutes > 0 -> append("$hours hour${if (hours != 1) "s" else ""} and $minutes minute${if (minutes != 1) "s" else ""}") hours > 0 -> append("$hours hour${if (hours != 1) "s" else ""}") minutes > 0 -> append("$minutes minute${if (minutes != 1) "s" else ""}") else -> append("0 minutes") } append(" to the target time") } } // 测试调用 fun main() { println(getTimeUntilTarget("18:00:00")) }
关键说明
- 时间解析:
LocalTime.parse()默认支持"HH:mm:ss"的ISO标准格式,无需自定义格式化器,简洁可靠。 - 跨天处理:自动判断目标时间是否已过当天,若已过则顺延至次日,避免出现负数间隔。
- 间隔计算:
Duration类专门用于计算两个时间点的间隔,API直观,避免手动计算的错误。 - 自然语言输出:自动处理"hour/hours"、"minute/minutes"的单复数,输出更符合日常表达习惯。
内容的提问来源于stack exchange,提问作者mepi0011
相关产品推荐
相关产品推荐

