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

Creador de credenciales web – Aplicación gratuita

Hoy te voy a presentar un creador de credenciales que acabo de programar y que…

1 semana hace

Desplegar PWA creada con Vue 3, Vite y SQLite3 en Apache

Ya te enseñé cómo convertir una aplicación web de Vue 3 en una PWA. Al…

2 semanas hace

Arquitectura para wasm con Go, Vue 3, Pinia y Vite

En este artículo voy a documentar la arquitectura que yo utilizo al trabajar con WebAssembly…

2 semanas hace

Vue 3 y Vite: crear PWA (Progressive Web App)

En un artículo anterior te enseñé a crear un PWA. Al final, cualquier aplicación que…

2 semanas hace

Errores de Comlink y algunas soluciones

Al usar Comlink para trabajar con los workers usando JavaScript me han aparecido algunos errores…

2 semanas hace

Esperar promesa para inicializar Store de Pinia con Vue 3

En este artículo te voy a enseñar cómo usar un "top level await" esperando a…

2 semanas hace

Esta web usa cookies.