我有一个名为
Long
的 delta
值,其中包含以毫秒为单位的时间值。
我正在尝试将其格式化为可读的
String
,例如00:00:00
,或者如果小时值为零00:00
。
private fun remainingTime(delta: Long): String {
val hours = TimeUnit.MILLISECONDS.toHours(delta)
return if (hours == 0L) {
String.format(
"%02d:%02d",
TimeUnit.MILLISECONDS.toMinutes(delta) - TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(delta)),
TimeUnit.MILLISECONDS.toSeconds(delta) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(delta))
)
} else {
String.format(
"%02d:%02d:%02d",
hours,
TimeUnit.MILLISECONDS.toMinutes(delta) - TimeUnit.MINUTES.toMinutes(TimeUnit.MILLISECONDS.toHours(delta)),
TimeUnit.MILLISECONDS.toSeconds(delta) - TimeUnit.MINUTES.toSeconds(TimeUnit.MILLISECONDS.toMinutes(delta))
)
}
}
上面的代码可以工作,但看起来效率很低。我打赌有一种聪明的 Kotlin 方法可以解决这个问题?
更简洁的代码版本是在
to*Part()
上使用 Duration
函数,例如
val duration = java.time.Duration.ofMillis(delta)
val hours = duration.toHours()
val minutes = duration.toMinutesPart()
val seconds = duration.toSecondsPart()
return if (hours == 0L) {
String.format("%02d:%02d", minutes, seconds)
} else {
String.format("%02d:%02d:%02d", hours, minutes, seconds)
}
这里可以使用Kotlin的字符串插值:
fun main() {
println(remainingTime(1711642863619))
}
private fun Long.formatTheDuration(): String {
val hours = TimeUnit.MILLISECONDS.toHours(this)
val minutes = TimeUnit.MILLISECONDS.toMinutes(this) % 60
val seconds = TimeUnit.MILLISECONDS.toSeconds(this) % 60
return buildString {
if (hours > 0) {
append("%02d:".format(hours))
}
append("%02d:%02d".format(minutes, seconds))
}
}
private fun remainingTime(delta: Long): String {
return delta.formatDuration()
}