Tiempo relativo con JavaScript y RelativeTimeFormat

En este post de JavaScript vamos a mostrar el tiempo relativo transcurrido o faltante entre 2 fechas de manera relativa usando Intl.RelativeTimeFormat.

Básicamente vamos a mostrar el “hace 2 minutos”, “hace 2 horas,” “dentro de 1 día”, “dentro de un mes” pero siendo capaces de cambiar el idioma.

De este modo podremos mostrar el tiempo que falta o el tiempo que ha transcurrido con JavaScript en cualquier idioma.

Creando un formateador

Primero vamos a instanciar el RelativeTimeFormat así:

En este caso le estoy indicando el locale como es-MX, que sería español de México. Luego podemos invocar a format indicando la cantidad y la unidad de medida.

Indicar tiempo transcurrido o faltante según idioma con JS

Ejemplos:

Si te fijas, se agrega automáticamente el “hace X horas” o minutos, y también el “dentro de X minutos”, ya sea horas, días, etcétera. Si cambiamos el locale, ahora lo dice en otro idioma:

Además, el formateador hace la pluralización, si es 1 minuto entonces dice 1 minuto, si es 0 o más de uno, dice “minutos” y esto es válido para cualquier idioma o medida de tiempo.

RelativeTimeFormat con fechas (clase Date)

Ya te enseñé a mostrar el tiempo transcurrido de manera relativa y según el idioma pero para enteros definidos por nosotros.

Ahora veamos cómo podemos hacerlo con fechas.

Como ya te mostré en mi post de sumar y restar fechas con JavaScript, podemos obtener la cantidad de segundos, minutos, horas, días, semanas o meses a partir de los milisegundos de diferencia.

En este caso vamos a ver cómo mostrar, de manera relativa y elegante, cuánto tiempo falta para una fecha del futuro. He elegido la fecha de salida de RE4 remake que es el 23 de marzo de 2023.

Creamos la fecha del futuro y luego la fecha actual. Luego calculamos la diferencia en días convirtiendo los milisegundos a segundos, luego a minutos, luego a horas y luego a días en la línea 5.

Finalmente en la línea 6 formateamos esa diferencia y obtendremos la salida: in 55.509 days

No te preocupes por los decimales, puedes invocar a Math.floor para redondear hacia abajo y así obtener un entero.

La magia de esto es que al cambiar el locale todo seguirá funcionando igual y se mostrará en el idioma del usuario.

Bonus: tiempo transcurrido del pasado

Si hacemos la misma operación que el ejemplo anterior pero ahora ponemos una fecha del pasado, entonces el resultado será un número negativo y el formateador seguirá funcionando sin problemas.

Así, si nosotros anunciamos un producto que saldrá en el futuro, a los usuarios les aparecerá “dentro de X días” pero si visitan la página del producto después del estreno, aparecerá “hace X días”.

Mira el siguiente ejemplo. He cambiado la fecha de la línea 2 para que sea una fecha del pasado, lo demás lo he dejado intacto.

La salida es: 309.493 days ago

Conclusión

Con todas estas APIs de Intl podemos formatear números, fechas, fechas relativas y dinero dependiendo del idioma de los usuarios.

No olvides que esto sirve en JavaScript del lado del cliente y también en el lado del servidor con Node.

La API que te mostré aquí permite más cosas como formatear por partes, indicar otros estilos, etcétera. Puedes leer la documentación por aquí.

Y para terminar te dejo con más tutoriales de JavaScript en mi blog.

Encantado de ayudarte


Estoy disponible para trabajar en tu proyecto, modificar el programa del post o realizar tu tarea pendiente, no dudes en ponerte en contacto conmigo.

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