es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Problema al formar la salida deseada con Día, Hora y Minuto en Kotlin – Android

Tengo la siguiente función que toma totalMinutes como argumento.

 fun minutesToDaysHoursMinutes(totalMinutes: Double): String? {
    var returnString = ""
    try {
        var minutes = 0.0
        if (totalMinutes > 6000) {
            val days = totalMinutes / 1440
            val remainingMins = totalMinutes - (1440 * days) // 310
            var hours = remainingMins / 60
            minutes = remainingMins - (hours * 60)
            if (minutes >= 30) {
                hours += 1
            }
            returnString = String.format("%01dd %01dh", days.toInt(), (hours + 1).toInt())
        } else if (totalMinutes > 60) {
            returnString = String.format("%01dh %01dm", (totalMinutes / 60).toInt(), minutes.toInt())
        } else {
            returnString = String.format("%01dm", minutes.toInt())
        }
    } catch (e: Exception) {
        Log.e(">> e1", ">>> e5")
        e.printStackTrace()
    }
    return returnString
}

Llamando a la función para 6050 minutos como:

tvTimeToCharge.text = minutesToDaysHoursMinutes(6050.0)

Estoy obteniendo esta salida: 4d 0h

Pero la salida debería ser 4d 5h

¿En qué me estoy equivocando?
La requisito de salida es la siguiente:

6050 minutos se muestra como: 4d 5h (son 4 días, 4 horas y 50 minutos, redondeamos los 50 minutos a 1 hora)

6090 minutos se muestra como: 4d 6h (son 4 días, 5 horas y 30 minutos, redondeamos los 30 minutos a 1 hora)

6089 minutos se muestra como: 4d 5h (son 4 días, 5 horas y 29 minutos, redondeamos los 29 minutos a 0 horas)

Avísame si algo no está correcto. Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El problema con la implementación actual es que siempre suma 1 hora al cálculo de las horas, incluso si los minutos se redondean hacia abajo. Para solucionar este problema, necesitamos agregar una lógica para verificar si los minutos restantes se redondean hacia arriba a una hora adicional o no.

    Aquí tienes una implementación actualizada de la función minutesToDaysHoursMinutes:

    fun minutesToDaysHoursMinutes(totalMinutes: Double): String? {
        var returnString = ""
        try {
            var minutes = 0.0
            if (totalMinutes > 6000) {
                val days = totalMinutes / 1440
                val remainingMins = totalMinutes - (1440 * days)
                var hours = remainingMins / 60
                minutes = remainingMins - (hours * 60)
                if (minutes >= 30) {
                    hours += 1
                }
                if (hours >= 24) {
                    days += 1
                    hours -= 24
                }
                returnString = String.format("%01dd %01dh", days.toInt(), hours.toInt())
            } else if (totalMinutes > 60) {
                val hours = (totalMinutes / 60).toInt()
                minutes = totalMinutes - (hours * 60)
                if (minutes >= 30) {
                    hours += 1
                }
                returnString = String.format("%01dd %01dh", 0, hours)
            } else {
                returnString = String.format("%01dm", totalMinutes.toInt())
            }
        } catch (e: Exception) {
            Log.e(">> e1", ">>> e5")
            e.printStackTrace()
        }
        return returnString
    }
    

    En esta implementación, agregamos una verificación adicional para ver si las horas totales redondeadas exceden las 24. Si es así, agregamos un día adicional y restamos 24 de la variable de horas.

    Además, para los casos en los que la duración sea menor a una hora, establecemos la variable de días en 0 y solo mostramos las horas redondeadas.

    Con estos cambios, la función ahora debería devolver la salida correcta para los requisitos dados.

Comments are closed.