Cómo operar fechas en Javascript
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)