如何将 1800 秒格式化为 MM:SS 格式

How to format 1800 seconds to MM:SS format

我有以下用于简单倒数计时器的 Kotlin 代码:

val thousand: Long = 1000

val timer = object: CountDownTimer(1800000, 1000) {

    override fun onTick(millisUntilFinished: Long) {
        var timeResult = millisUntilFinished/thousand
        textTimer.text = "$timeResult"
    }
    override fun onFinish() {
        textTimer.text = "Time is out"
    }
}
timer.start()
textTimer.text = "$timer"

如何在 Kotlin 中将 1800 seconds 格式化为 30 min : 00 sec

以下代码可以将毫秒(这是您最初拥有的)转换为分钟和秒:

val milliseconds: Long = 1800000

val minutes = milliseconds / 1000 / 60
val seconds = milliseconds / 1000 % 60

println("$minutes min : $seconds sec")

输出:

30 min : 0 sec

编辑 1:

如果严格需要从秒到分秒,去掉多余的除以1000即可。

代码为:

val seconds: Long = 1800

val minutes = milliseconds / 60
val seconds = milliseconds % 60

println("$minutes min : $seconds sec")

原始问题中的代码包含毫秒,这就是我从毫秒中提到它的原因。

编辑 2:

遗漏了两位数格式。

@forpas 使用 .toString().padStart(2, '0') 的答案将给出正确的格式化输出。所以,正确的代码是:

val milliseconds: Long = 1800000

val minutes = milliseconds / 1000 / 60
val seconds = milliseconds / 1000 % 60

println("{$minutes.toString().padStart(2, '0')} min : {$seconds.toString().padStart(2, '0')} sec")

输出:

30 min : 00 sec

您通过整数除法和取模得到数字 (%)
并使用 padStart():

格式化为 2 位数字
val secs = 1800
val formatted = "${(secs / 60).toString().padStart(2, '0')} min : ${(secs % 60).toString().padStart(2, '0')} sec"
println(formatted)

将打印

30 min : 00 sec

这是我的代码目前的样子:

val timer = object: CountDownTimer(1800000, 1000) {

    override fun onTick(millisUntilFinished: Long) {

        val timeResult = 
            "${(millisUntilFinished / 1000 / 60).toString().padStart(2, '0')}:" +
            "${(millisUntilFinished / 1000 % 60).toString().padStart(2, '0')} "

        textTimer.text = "$timeResult"
    }
    override fun onFinish() {
        textTimer.text = "Time is out"
    }
}
timer.start()
textTimer.text = "$timer"

由于您的目标是 JVM,因此您应该使用 Java 8 Date/Time Api。您可以像这样创建一个非常简洁的函数:

fun countdown(s: Long) = with(LocalTime.ofSecondOfDay(s)) {
    String.format("%02d min :%02d sec", minute, second)
}

countdown(1800) // 30 min : 00 sec

建议:

  • 不要在调用点(在 onTick 中)进行计算。这使得不必要的代码难以理解。为此创建一个单独的函数。

  • 这是一个简单的计算,但请使用标准库提供的内容。首先,优化了代码,其次,您可以轻松扩展功能以计算小时等。未经测试的手写代码容易出错。