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í.
El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…
En este post te voy a enseñar a designar una carpeta para imprimir todos los…
En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…
Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…
Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…
Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…
Esta web usa cookies.