Как отформатировать 1800 секунд в формате MM: SS - PullRequest
0 голосов
/ 08 января 2019

У меня есть следующий код Котлина для простого таймера обратного отсчета:

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"

Как отформатировать 1800 seconds в 30 min : 00 sec в Kotlin ?

Ответы [ 4 ]

0 голосов
/ 09 января 2019

Поскольку вы ориентируетесь на 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). Это делает код ненужным трудным для понимания. Создайте для этого отдельную функцию.

  • Это простой расчет, но используйте то, что дают вам стандартные библиотеки. Во-первых, код оптимизирован, а во-вторых, вы можете легко расширить функцию для подсчета часов и так далее. Неопробованный вручную созданный код подвержен ошибкам.

0 голосов
/ 08 января 2019

Вы получаете числа по целочисленному делению и по модулю (%)
и форматирование до 2 цифр с помощью padStart():

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
0 голосов
/ 08 января 2019

Вот как выглядит мой код на данный момент:

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"

enter image description here

0 голосов
/ 08 января 2019

Следующий код может конвертировать из миллисекунд (что у вас изначально) в минуты и секунды:

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

...