在 Kotlin 中获取时间字符串和实际时间之间的持续时间的正确且最简单的方法是什么?
我有以下时间字符串(timeStr):“18:00:00” 最后我喜欢这样的字符串:“x 小时 y 分钟到...”
我目前的解决方案:
val diff: Long = (LocalTime.parse(timeStr).toSecondOfDay() - LocalTime.now().toSecondOfDay()).toLong()
val duration: LocalTime = LocalTime.ofSecondOfDay(diff)
outStr = duration.hour + "hours and " + duration.minute + " minutes to ..."
我知道这个解决方案很容易出错,所以我正在寻找一个干净的解决方案。我最近才开始使用 Kotlin,还不熟悉其可能性。
正如“匿名”评论的那样,您可以使用
Duration
类来实现此目的:
fun getDuration(timeStr: String): String {
val time = LocalTime.parse(timeStr)
val now = LocalTime.now()
val duration = Duration.between(now, time)
val hours = duration.toHours()
val minutes = duration.minusHours(hours).toMinutes()
return if (hours == 0L) {
"$minutes minutes to ..."
} else if (minutes == 0L) {
"$hours hours to ..."
} else {
"$hours hours and $minutes minutes to ..."
}
}
java.time.Duration
,它以 ISO-8601 标准为模型,并作为 JSR-310 实现的一部分随 Java-8 一起引入。 Java-9 引入了一些更方便的方法。
演示:
public class Main {
public static void main(String[] args) {
Duration duration = Duration.between(LocalTime.now(), LocalTime.parse("18:00:00"));
// Default format
System.out.println(duration);
// Custom format
// ####################################Java-8####################################
String formattedDuration = String.format("%d hours and %d minutes", duration.toHours(),
duration.toMinutes());
System.out.println(formattedDuration);
// ##############################################################################
// ####################################Java-9####################################
formattedDuration = String.format("%d hours and %d minutes", duration.toHoursPart(),
duration.toMinutesPart());
System.out.println(formattedDuration);
// ##############################################################################
}
}
示例运行的输出:
PT47M23.239687S
0 hours and 47 minutes
0 hours and 47 minutes
从 Trail:日期时间了解现代日期时间 API。