Cómo operar fechas en Javascript

Fácil - 2 min. lectura

A veces necesitamos realizar operaciones como sumar un intervalo de tiempo a nuestras fechas generadas con Javascript. Para ellos podemos optar por utilizar librerías como dayjs o luxon.

Estas librerías nos permiten hacer muchas más operaciones y son una muy buena opción a tener en cuenta, pero si lo que deseamos es simplemente añadir (o substraer) podremos hacerlo usando el objeto Date sin necesidad de añadir librerías extras a nuestro proyecto.

Para ello tendremos que conocer los métodos del objeto Date.

Nos interesará sobre todo aquellos que permitan establecer el tiempo, días, meses o años.

Conociendo estos métodos, si queremos sumar dos meses a una fecha dada haremos lo siguiente:

const now = new Date() // 2020-04-12T22:45:54.194Z
now.setMonth(now.getMonth() + 2)
console.log(now) // 2020-06-12T22:45:54.194Z

Con años y días lo haremos de forma similar

const now = new Date() // 2020-04-12T22:45:54.194Z
now.setDate(now.getDate() + 2)
now.setFullYear(now.getFullYear() + 2)
console.log(now) // 2022-04-14T22:45:54.194Z

Aunque podríamos hacerlo igual para hora, minutos y segundos son sus respectivos métodos, podemos usar un mismo método para manipular el tiempo (setTime() y getTime() ).

Estos métodos nos devuelven la marca de tiempo Unix, es decir, la cantidad de milisegundos que pasaron desde el 1 de enero de 1970 00:00:00 UTC, por lo que si queremos sumar 1 segundo le añadiremos a 1000ms, si queremos añadir 1 minuto, añadiremos 60000 y para una hora 3600000

const now = new Date() // 2020-04-12T22:45:54.194Z
now.setTime(now.getTime() + 60000)
console.log(now) // 2022-04-12T22:46:54.194Z

Con todo esto ya podríamos crearnos una función que nos simplificase la tarea de añadir intervalos a nuestras fechas

function addInterval(date, interval, unit){
  const intervals = {
    second: () => date.setTime(date.getTime() + (unit * 1000) ),
    minute: () => date.setTime(date.getTime() + (unit * 60000) ),
    hour: () => date.setTime(date.getTime() +( unit * 3600000) ),
    day: () => date.setDate(date.getDate() + unit),
    month: () => date.setMonth(date.getMonth() + unit),
    year: () => date.setFullYear(date.getFullYear() + unit),
  }
  return new Date(intervals[interval]())
}
addInterval(new Date("1980-07-26"), "year", 40)