我有一个名为deltaLong值,其中包含以毫秒为单位的时间值.

我试图将其格式化为可读的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方法来解决这个问题.

推荐答案

更简洁的代码版本是在Duration上使用to*Part()函数,例如:

    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相关问答推荐

使用另一个对象的列表创建对象

Kotlin 函数名后面的大括号是什么意思?

为什么 Kotlin 中没有 init 块的注释

Kotlin 如何使用其 get 函数在内部检索映射值

为什么 trySend 会发出假数据?

判断 Kotlin 变量是否为函数

如何将 `throw` 放置在辅助函数中但仍然具有空安全性?

Saripaar formvalidation 在 kotlin 中第二次不起作用

kotlin 扩展属性的惰性初始化器中的这个引用

如何在调试中修复 ClassNotFoundException: kotlinx.coroutines.debug.AgentPremain?

无法在 kotlin android 中以编程方式禁用 EditText

Kotlin Compose,在行中对齐元素

Foo::class.java 和 Foo::javaClass 有什么区别?

有没有办法在数据类构建时转换属性的值?

任何处理器都无法识别以下选项:'[kapt.kotlin.generated, room.incremental]'

无法解决:androidx.lifecycle:lifecycle-extensions-ktx:2.0.0-alpha1

IllegalStateException:function = , count = 3, index = 3

Kotlin中的函数接口

访问Kotlin中的属性委托

Kotlin反射不可用