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.
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.
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:
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.
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.
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í.
Hoy te voy a presentar un creador de credenciales que acabo de programar y que…
Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…
En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…
En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…
Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…
En este artículo te voy a enseñar cómo usar un "top level await" esperando a…
Esta web usa cookies.