javascript

Tiempo transcurrido con JavaScript – Diferencia entre fechas

Hoy vamos a trabajar con JavaScript para calcular la diferencia entre 2 fechas, es decir, calcular el tiempo que ha transcurrido desde una fecha a otra, ya sea para sacar el tiempo transcurrido desde el pasado hasta hoy, desde hoy al futuro o desde una fecha a otra.

Te voy a enseñar a calcular el tiempo transcurrido de manera precisa y también de la manera en la que la calculamos como humanos.

Los ejemplos aquí mostrados podrán ser usados en el lado del cliente o del lado del servidor con Node.

Milisegundos transcurridos entre fechas con JS

Primero vamos a ver cómo obtener la cantidad de milisegundos que han pasado desde una fecha hasta otra. Podemos usar la clase Date pasando la fecha en el formato AAAA-MM-DDTHH:MM:SS (en donde la T es la letra T literal) para construir el objeto, y luego operar con getTime:

// En formato AAAA-MM-DDTHH:MM:SS
const milisegundosTranscurridosEntreFechas = (inicio, fin) => {
    return new Date(fin).getTime() - new Date(inicio).getTime();
}

Una vez que tenemos los milisegundos podemos obtener cualquier unidad de tiempo haciendo divisiones, es decir, podemos calcular los años, meses, días, horas, minutos y segundos transcurridos.

Tiempo transcurrido preciso

Entonces una vez que tenemos los milisegundos podemos hacer algunas operaciones para calcular el tiempo transcurrido. Primero sacamos los años, luego meses, días, horas, minutos y segundos.

He encerrado este comportamiento en una función de JavaScript que regresa un objeto con todas esas propiedades, así tú puedes usarlos e imprimirlos como prefieras.

const tiempoTranscurridoPreciso = (diferenciaEnMilisegundos) => {
    const diasEnUnAño = 365.25;
    const diasEnUnMes = 30.437;
    const milisegundosEnUnSegundo = 1000;
    const milisegundosEnUnMinuto = milisegundosEnUnSegundo * 60;
    const milisegundosEnUnaHora = milisegundosEnUnMinuto * 60;
    const milisegundosEnUnDia = milisegundosEnUnaHora * 24;
    const milisegundosEnUnMes = milisegundosEnUnDia * diasEnUnMes;
    const milisegundosEnUnAño = milisegundosEnUnDia * diasEnUnAño;
    const años = Math.floor(diferenciaEnMilisegundos / milisegundosEnUnAño);
    diferenciaEnMilisegundos -= años * milisegundosEnUnAño;
    const meses = Math.floor(diferenciaEnMilisegundos / milisegundosEnUnMes);
    diferenciaEnMilisegundos -= meses * milisegundosEnUnMes;
    const dias = Math.floor(diferenciaEnMilisegundos / milisegundosEnUnDia);
    diferenciaEnMilisegundos -= dias * milisegundosEnUnDia;
    const horas = Math.floor(diferenciaEnMilisegundos / milisegundosEnUnaHora);
    diferenciaEnMilisegundos -= horas * milisegundosEnUnaHora;
    const minutos = Math.floor(diferenciaEnMilisegundos / milisegundosEnUnMinuto);
    diferenciaEnMilisegundos -= minutos * milisegundosEnUnMinuto;
    const segundos = Math.floor(diferenciaEnMilisegundos / milisegundosEnUnSegundo);
    diferenciaEnMilisegundos -= segundos * milisegundosEnUnSegundo;
    return { años, meses, dias, horas, minutos, segundos };
}

JavaScript: calcular transcurrido como los humanos lo hacemos

Nosotros calculamos el tiempo de manera distinta.

No tomamos en cuenta años bisiestos ni días del mes, simplemente tomamos el día más cercano del mes y contamos cuántos días han pasado desde ese día, llevando en cuenta los años y meses, además de tomar en cuenta si la fecha ya ha pasado en este año o todavía no.

Tomando eso en cuenta he creado la siguiente función que indica cuánto tiempo ha transcurrido desde una fecha, enfocada a calcular la edad de una persona.

Poniendo todo junto

Ya te he mostrado las 2 funciones, a partir de ellas y usando Date puedes calcular el tiempo que ha transcurrido entre cualquier período de tiempo ya sea en el navegador o con Node. Veamos un ejemplo de uso:

const inicio = "2020-03-23T21:23:00";
const fin = "2023-09-07T00:00:00";
const diferenciaEnMilisegundos = milisegundosTranscurridosEntreFechas(inicio, fin);
const diferenciaPrecisa = tiempoTranscurridoPreciso(diferenciaEnMilisegundos);
const diferenciaSegunHumanos = tiempoTranscurridoSegunHumanos(inicio);
console.log({ diferenciaEnMilisegundos, diferenciaPrecisa, diferenciaSegunHumanos });

La salida es como se ve a continuación:

Tiempo transcurrido entre 2 fechas con JavaScript

Obviamente tú puedes cambiar los formatos y la forma de presentación. El código completo queda así:

// En formato AAAA-MM-DDTHH:MM:SS
const milisegundosTranscurridosEntreFechas = (inicio, fin) => {
    return new Date(fin).getTime() - new Date(inicio).getTime();
}

const tiempoTranscurridoPreciso = (diferenciaEnMilisegundos) => {
    const diasEnUnAño = 365.25;
    const diasEnUnMes = 30.437;
    const milisegundosEnUnSegundo = 1000;
    const milisegundosEnUnMinuto = milisegundosEnUnSegundo * 60;
    const milisegundosEnUnaHora = milisegundosEnUnMinuto * 60;
    const milisegundosEnUnDia = milisegundosEnUnaHora * 24;
    const milisegundosEnUnMes = milisegundosEnUnDia * diasEnUnMes;
    const milisegundosEnUnAño = milisegundosEnUnDia * diasEnUnAño;
    const años = Math.floor(diferenciaEnMilisegundos / milisegundosEnUnAño);
    diferenciaEnMilisegundos -= años * milisegundosEnUnAño;
    const meses = Math.floor(diferenciaEnMilisegundos / milisegundosEnUnMes);
    diferenciaEnMilisegundos -= meses * milisegundosEnUnMes;
    const dias = Math.floor(diferenciaEnMilisegundos / milisegundosEnUnDia);
    diferenciaEnMilisegundos -= dias * milisegundosEnUnDia;
    const horas = Math.floor(diferenciaEnMilisegundos / milisegundosEnUnaHora);
    diferenciaEnMilisegundos -= horas * milisegundosEnUnaHora;
    const minutos = Math.floor(diferenciaEnMilisegundos / milisegundosEnUnMinuto);
    diferenciaEnMilisegundos -= minutos * milisegundosEnUnMinuto;
    const segundos = Math.floor(diferenciaEnMilisegundos / milisegundosEnUnSegundo);
    diferenciaEnMilisegundos -= segundos * milisegundosEnUnSegundo;
    return { años, meses, dias, horas, minutos, segundos };
}
const obtenerFechaEnEsteAño = (fechaComoCadena) => {
    const ahora = new Date();
    const fechaEnEsteAño = new Date(fechaComoCadena);
    fechaEnEsteAño.setFullYear(ahora.getFullYear());
    return fechaEnEsteAño;
}

const diasEnMesAnterior = () => {
    const ahora = new Date();
    ahora.setMonth(ahora.getMonth() - 1, 0);
    return ahora.getDate();
}
// En formato AAAA-MM-DDTHH:MM:SS
const tiempoTranscurridoSegunHumanos = (fechaComoCadena) => {
    let fechaDeNacimiento = new Date(fechaComoCadena);
    const ahora = new Date();
    const laFechaYaHaPasado = ahora.getTime() > obtenerFechaEnEsteAño(fechaComoCadena).getTime();
    let años = ahora.getFullYear() - fechaDeNacimiento.getFullYear() + (laFechaYaHaPasado ? 0 : -1);
    let meses, dias;
    const diaActual = new Date();
    diaActual.setDate(fechaDeNacimiento.getDate());
    if (ahora.getDate() < diaActual.getDate()) {
        dias = ahora.getDate() + (diasEnMesAnterior() - fechaDeNacimiento.getDate()) + 1;
    } else {
        dias = ahora.getDate() - fechaDeNacimiento.getDate();
    }
    if (laFechaYaHaPasado) {
        meses = ahora.getMonth() - fechaDeNacimiento.getMonth() - 1;
        if (meses < 0) {
            meses = 0;
        }
    } else {
        meses = (11 - fechaDeNacimiento.getMonth()) + ahora.getMonth();
    }
    return { años, meses, dias }
};


const inicio = "2020-03-23T21:23:00";
const fin = "2023-09-07T00:00:00";
const diferenciaEnMilisegundos = milisegundosTranscurridosEntreFechas(inicio, fin);
const diferenciaPrecisa = tiempoTranscurridoPreciso(diferenciaEnMilisegundos);
const diferenciaSegunHumanos = tiempoTranscurridoSegunHumanos(inicio);
console.log({ diferenciaEnMilisegundos, diferenciaPrecisa, diferenciaSegunHumanos });

Te invito a explorar más sobre JavaScript en mi blog.

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.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Entradas recientes

Servidor HTTP en Android con Flutter

El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…

4 días hace

Imprimir automáticamente todos los PDF de una carpeta

En este post te voy a enseñar a designar una carpeta para imprimir todos los…

4 días hace

Guía para imprimir en plugin versión 1 desde Android

En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…

1 semana hace

Añadir tasa de cambio en sistema de información

Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…

2 semanas hace

Comprobar validez de licencia de plugin ESC POS

Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…

2 semanas hace

Imprimir euro € en impresora térmica

Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…

4 semanas hace

Esta web usa cookies.