Java / Kotlin / Android - формат времени (чч: мм: сс) и удаление ненужных нулей с самого начала - PullRequest
0 голосов
/ 07 марта 2019

Мое приложение отображает оставшееся время в таком формате чч: мм: сс, например, 01:05:45, что означает один час 5 минут и 45 секунд.

Когда часы или минуты равны нулю, я бы не хотел их отображать. В настоящее время, если осталось 45 секунд, мой таймер покажет '00: 00: 45 '. Ожидаемый результат - всего 45.

Мне нужен какой-то метод Java / Kotlin / Android для получения следующих выводов:

  • 1 час 13 минут и 10 секунд ==> 01:13:10
  • 0 часов 13 минут и 10 секунд ==> 13:10
  • 3 часа 0 минут и 16 секунд ==> 03:00:16
  • 0 час 0 минут и 5 секунд ==> 5

В настоящее время я использую такую ​​строку в качестве форматера:

<string name="time_default_formatter" translatable="false">%02d:%02d:%02d</string>

Я пытался вручную заменить строку "00:" на "", но она не работает, когда дело доходит до 3-го примера. Кроме того, я думаю, что стандартное форматирование должно обеспечивать что-то подобное, но я не могу найти его.

Редактировать: я могу сделать это в коде. Дело в том, что я ищу элегантное решение.

Ответы [ 2 ]

1 голос
/ 07 марта 2019

Строковые ресурсы предназначены для отображения фактического текста в легко локализуемом виде. Они не предназначены для форматирования даты и времени; для этого DateUtils.

Этот класс содержит различные связанные с датами утилиты для создания текста для таких вещей, как истекшие диапазоны времени и даты, строки для дней неделя и месяцы, текст AM / PM и т. д.

Который поставляется с удобным formatElapsedTime() методом; который форматирует продолжительность, как вы ожидаете.

Форматирует прошедшее время в форме «ММ: СС» или «Ч: ММ: СС»…

К сожалению, последний упомянутый вами формат (который отображает только секунды) довольно необычен, поэтому не поддерживается DateUtils. Хотя это можно легко исправить с помощью следующей функции.

fun formatDuration(seconds: Long): String = if (seconds < 60) {
    seconds.toString()
} else {
    DateUtils.formatElapsedTime(seconds)
}
0 голосов
/ 07 марта 2019

Пока что я не нашел ни одного элегантного решения на мой взгляд, и я делаю это так.

У меня есть три строки форматирования, по одной для каждой ситуации:

<string name="time_hours_minutes_seconds_formatter" translatable="false">%02d:%02d:%02d</string>
<string name="time_minutes_seconds_formatter" translatable="false">%02d:%02d</string>
<string name="time_seconds_formatter" translatable="false">%02d</string>

Тогда, вручную форматирую с помощью функции (в Kotlin):

    private fun formatTime(millis: Long): String {
    val hours = TimeUnit.MILLISECONDS.toHours(millis) % 24
    val minutes = TimeUnit.MILLISECONDS.toMinutes(millis) % 60
    val seconds = TimeUnit.MILLISECONDS.toSeconds(millis) % 60

    return when {
        hours == 0L && minutes == 0L -> String.format(
            resources.getString(R.string.time_seconds_formatter), seconds
        )

        hours == 0L && minutes > 0L -> String.format(
            resources.getString(R.string.time_minutes_seconds_formatter), minutes, seconds
        )

        else -> resources.getString(R.string.time_hours_minutes_seconds_formatter, hours, minutes, seconds)
    }
}
...