Mi aplicación muestra el tiempo restante en formato hh:mm:ss, por ejemplo, 01:05:45, lo que significa una hora, 5 minutos y 45 segundos.
Cuando las horas o los minutos son cero, me gustaría no mostrarlos. Actualmente, si quedan 45 segundos, mi temporizador mostrará '00:00:45'. El resultado esperado es solo '45'.
Necesito algún tipo de método Java/Kotlin/Android para producir los siguientes resultados:
Actualmente uso esa cadena como formateador:
<string name="time_default_formatter" translatable="false">%02d:%02d:%02d</string>Traté de reemplazar manualmente la cadena "00:" con "" pero falla cuando se trata de un tercer ejemplo. Además, creo que el formato estándar debería proporcionar algo así, pero sigo sin encontrarlo.
Editar: puedo hacerlo en código. La cosa es que estoy buscando una solución elegante.
Los recursos de cadena están destinados a mostrar texto real de una manera que sea fácilmente localizable. No están destinados a formatear fechas y horas; para eso está DateUtils .
Esta clase contiene varias utilidades relacionadas con la fecha para crear texto para cosas como intervalos de fechas y tiempo transcurrido, cadenas para días de la semana y meses, y texto AM/PM, etc.
Que viene con un conveniente método formatElapsedTime() que formatea una duración como cabría esperar.
Formatea un tiempo transcurrido en la forma "MM:SS" o "H:MM:SS"...
Desafortunadamente, el último formato que mencionó (que solo muestra segundos) es bastante poco común, por lo tanto, DateUtils no lo admite. Aunque esto se puede remediar fácilmente con la siguiente función.
fun formatDuration(seconds: Long): String = if (seconds < 60) { seconds.toString() } else { DateUtils.formatElapsedTime(seconds) }Hasta ahora no he encontrado ninguna solución elegante en mi opinión y lo hago así.
Tengo tres cadenas de formato, una para cada situación:
<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>Luego, lo formateo manualmente usando la función (en 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) } }