Minutos a tiempo legible en JavaScript

Convertir minutos a texto legible en JavaScript

En un sistema web en el que he estado trabajando tuve la necesidad de convertir minutos a su representación como texto, en cantidades más grandes. Por ejemplo, 59 minutos son 59 minutos, pero 60 minutos son 1 hora, así que en lugar de mostrarlos como minutos, se muestran como horas.

Minutos a tiempo legible en JavaScript
Minutos a tiempo legible en JavaScript

La función que escribí puede convertir cualquier número de minutos a su representación como horas, días, semanas, meses o años. Con los ejemplos veremos de lo que hablo.

Función que convierte minutos a una representación entendible

Como lo dije, esta función de JavaScript convierte un número de minutos a su representación como otras unidades de tiempo. Veamos algunos ejemplos:

  • 0 minuto(s) son 0 minutos
  • 1 minuto(s) son 1 minuto
  • 20 minuto(s) son 20 minutos
  • 50 minuto(s) son 50 minutos
  • 70 minuto(s) son 1 hora, 10 minutos
  • 60 minuto(s) son 1 hora
  • 59 minuto(s) son 59 minutos
  • 7200 minuto(s) son 5 días
  • 1440 minuto(s) son 1 día
  • 7250 minuto(s) son 5 días, 50 minutos
  • 36080 minuto(s) son 3 semanas, 4 días, 1 hora, 20 minutos
  • 72080 minuto(s) son 1 mes, 2 semanas, 6 días, 1 hora, 20 minutos
  • 86400 minuto(s) son 2 meses
  • 720800 minuto(s) son 1 año, 4 meses, 2 semanas, 6 días, 13 horas, 20 minutos
  • 894540 minuto(s) son 1 año, 8 meses, 3 semanas, 5 horas

Con eso ya nos vamos dando una idea de lo que ofrece esta función. Se puede modificar para que convierta segundos o incluso milisegundos; así como también se puede editar para soportar décadas, siglos y esas cosas; todo copiando y pegando.

La función es esta:

/**
 * Función que convierte un número de minutos
 * a su representación legible en horas, días, semanas,
 * meses y años. Por ejemplo:
 * 
 * 72080 minuto(s) son 1 mes, 2 semanas, 6 días, 1 hora, 20 minutos
 * 
 * 
 * @author parzibyte
 */
const minutosATiempo = minutos => {
    const leyenda = (numero, palabra, plural) => numero === 0 || numero > 1 ? `${numero} ${palabra}${plural || "s"}` : `${numero} ${palabra}`;
    const MINUTOS_POR_HORA = 60,
        HORAS_POR_DIA = 24,
        DIAS_POR_SEMANA = 7,
        DIAS_POR_MES = 30,
        MESES_POR_ANIO = 12;
    if (minutos < MINUTOS_POR_HORA) return leyenda(minutos, "minuto");
    let horas = Math.floor(minutos / MINUTOS_POR_HORA),
        minutosSobrantes = minutos % MINUTOS_POR_HORA;
    if (horas < HORAS_POR_DIA) return leyenda(horas, "hora") + (minutosSobrantes > 0 ? ", " + minutosATiempo(minutosSobrantes) : "");
    let dias = Math.floor(horas / HORAS_POR_DIA);
    minutosSobrantes = minutos % (MINUTOS_POR_HORA * HORAS_POR_DIA);
    if (dias < DIAS_POR_SEMANA) return leyenda(dias, "día") + (minutosSobrantes > 0 ? ", " + minutosATiempo(minutosSobrantes) : "");
    let semanas = Math.floor(horas / (HORAS_POR_DIA * DIAS_POR_SEMANA));
    minutosSobrantes = minutos % (MINUTOS_POR_HORA * HORAS_POR_DIA * DIAS_POR_SEMANA);
    if (dias < DIAS_POR_MES) return leyenda(semanas, "semana") + (minutosSobrantes > 0 ? ", " + minutosATiempo(minutosSobrantes) : "");
    let meses = Math.floor(horas / (HORAS_POR_DIA * DIAS_POR_MES));
    minutosSobrantes = minutos % (MINUTOS_POR_HORA * HORAS_POR_DIA * DIAS_POR_MES);
    if (meses < MESES_POR_ANIO) return leyenda(meses, "mes", "es") + (minutosSobrantes > 0 ? ", " + minutosATiempo(minutosSobrantes) : "");
    let anios = Math.floor(horas / (HORAS_POR_DIA * DIAS_POR_MES * MESES_POR_ANIO));
    minutosSobrantes = minutos % (MINUTOS_POR_HORA * HORAS_POR_DIA * DIAS_POR_MES * MESES_POR_ANIO);
    return leyenda(anios, "año") + (minutosSobrantes > 0 ? ", " + minutosATiempo(minutosSobrantes) : "");
};
const tiempos = [
    0,
    1,
    20,
    50,
    70,
    60,
    59,
    7200,
    1440,
    7250,
    36080,
    72080,
    86400,
    720800,
    894540,
];
tiempos.forEach(tiempo => {
    console.log(`${tiempo} minuto(s) son ${minutosATiempo(tiempo)}`)
});

Se puede observar que la función recibe un número de minutos, y devuelve una cadena con texto legible. La unidad de medida se pluraliza correctamente gracias a la función (definida dentro de la misma) llamada leyenda. Esta función se encarga de agregar la “s” en caso de que el número sea 0 o mayor a 1, para mostrar correctamente “minuto” o “minutos” y lo mismo con las horas, días, etcétera.

Por cierto, si no entiendes la sintaxis, mira lo que son las arrow functions, plantillas de cadena y let y const.

Una cosa interesante es el uso de la recursión o recursividad; pues gracias a ella se ahorra código. En el primer intento no se me había ocurrido, pero después de pensar un poco me di cuenta de que con la recursividad podría evitar más condiciones y operaciones.

Ah, que quede claro que en el código también se muestran algunos ejemplos de uso, pero la función es independiente de todo ello.

Sobre el rendimiento

Sé bien que esta función no es la más eficaz, pues define una función dentro de sí misma, además de que puede caer en una gran pila de recursión (poco probable, pues aunque sean años no excede las 5 llamadas); pero es la única manera que se me ocurrió para resolver el problema.

No hay problema con el rendimiento; es decir, aunque la función podría estar más optimizada, ni siquiera se nota que sea lenta o algo así, sólo decía; de hecho puedes probar por ti mismo y verás que no pasa nada incluso con números grandes.

Descargar ejemplo

Si quieres, descarga el código de ejemplo. Para ejecutarlo puedes pegarlo en la consola del navegador, o guardarlo en un archivo, navegar con la terminal hasta donde lo hayas guardado y ejecutar node minutos.js en donde minutos.js es el nombre del archivo. Si no tienes Node.JS mira cómo instalarlo aquí.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *