Consigue fechas relativas en Javascript

Consigue fechas relativas en Javascript

Matías Hernández's photo
Matías Hernández
·Sep 13, 2022·

2 min read

Las fechas pueden ser algo bastante engorroso de trabajar, una de esas complicaciones nace cuando el requerimiento es el de mostrar la fecha de algún contenido de la aplicación en formato relativo a la fecha actual: Hace 2 semanas.

Por suerte, Javascript ofrece una solución nativa para esto Intl.RelativeTimeFormat.

Al igual que los otros constructores expuesto por el objeto Intl, este constructor recibe dos argumentos, el primero un string que identifica el lenguaje que se quiere utilizar, y el segundo un set de opciones:

Te invito a leer los otros artículos sobre Internacionalización:
Formato de Fechas y Formato de números

type Options = {
    localeMatches: 'best fit' | 'lookup',
    numeric: 'always' |'auto'  // The format of the output
    style: 'long' | 'short' | 'narrow'
}

El método format de este constructor también recibe dos argumentos:

  • Un valor entero que indica el total de tiempo que se quiere mostrar
  • Un string que identifica la unidad de tiempo a utilizar. (day,month,year, etc)
const formatter = new Intl.RelativeTimeFormat('es-ES');
const monthAgo = formatter.format(-1, 'month') // hace 1 mes
const futureMonth = formatter.format(1, 'month') // en 1 mes

¿Cómo utilizar las fechas relativas?

SI hablamos de fechas relativas es casi obvio que estarás usando fechas en alguna parte, por ejemplo: Tienes una colección de artículos que tienen una fecha de publicación, pero no quieres mostrar la fecha si no un texto indicando hace cuanto tiempo fueron creados.

Para lograrlo deberás hacer algo de matemáticas de fechas para obtener la diferencia y usar ese valor para obtener el texto relativo.

const publicationDate = new Date('2022/01/05')

const currentDate = new Date()

const msPerDay = 1000 * 60 * 60 * 24;

const diffTime = Math.abs(currentDate - publicationDate);
const diffDays = Math.ceil(diffTime / msPerDay);


const enRtf = new Intl.RelativeTimeFormat("en-US", {
  numeric: 'auto',
});

console.log(enRtf.format(-diffDays, "day")); // 251 days ago
console.log(enRtf.format(-diffDays/30, "month")); //8.367 months ago


const esRtf = new Intl.RelativeTimeFormat("es-ES", {
  numeric: 'auto',
});

console.log(esRtf.format(-diffDays, "day")); // hace 251 días
console.log(esRtf.format(-diffDays / 30, "month")); // hace 8.367 meses
 
Share this