Restar días de una fecha en JavaScript

603

¿Alguien sabe de una manera fácil de tomar una cita (por ejemplo, hoy) y retroceder X días?

Entonces, por ejemplo, si quiero calcular la fecha 5 días antes de hoy.

jonhobbs
fuente
44
Encontré problemas al usar la respuesta aceptada. Aparentemente, usar valores negativos en setDate () no funciona como se esperaba. Consulte stackoverflow.com/a/9037132/792287 para obtener otra solución (¿mejor?).
vandiedakaf
55
Posible duplicado: stackoverflow.com/questions/1187824/…
Anderson Green
Visite github.com/viebig/datetreta
Guilherme Viebig el

Respuestas:

962

Intenta algo como esto:

 var d = new Date();
 d.setDate(d.getDate()-5);

Tenga en cuenta que esto modifica el objeto de fecha y devuelve el valor de tiempo de la fecha actualizada.

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 5);

document.write('<br>5 days ago was: ' + d.toLocaleString());

Stephen Wrighton
fuente
99
La salida de eso me da una larga cadena de enteros. ¿Alguna idea de cómo formatearlo en 14/05/2012?
user525146
162
Dado que esto está en la parte superior de google, creo que respondería el comentario anterior: new Date(new Date().setDate(new Date().getDate()-5))eso será hace 5 días. En el ejemplo de la respuesta, páselo a una nueva fecha para obtener un objeto de fecha. Entonces new Date(d)es lo que quieres.
Jesse
8
El problema con esto es que puede terminar con 00, que no es un valor válido para la fecha.
DominicM
24
setDate(-1)fijará la fecha para el último día del mes
Peter
55
@ user525146 preguntó cómo formatear el número, no cuál es el número. No hay necesidad de respuestas condescendientes. Para dar formato al número, utilice uno de los Fecha toStringmétodos como toISOString, toDateString, etc.
Solicitud incorrecta
83
var dateOffset = (24*60*60*1000) * 5; //5 days
var myDate = new Date();
myDate.setTime(myDate.getTime() - dateOffset);

Si está realizando muchas manipulaciones de fecha dolorosas en toda su aplicación web, DateJS le hará la vida mucho más fácil:

http://simonwillison.net/2007/Dec/3/datejs/

karim79
fuente
23
es un caso extremo, pero esto puede fallar alrededor del inicio / final del horario de verano. no estás restando 5 días, sino 5 * 24 horas. el primer día del horario de verano es de solo 23 horas y el último es de 25 horas. generalmente no importa, pero es algo a considerar.
Kip
11
@Kip Odio el horario de verano ... y las zonas horarias. Todos deberíamos pasar a GMT.
cwallenpoole
66
@cwallenpoole para no reventar su burbuja, pero usan DST incluso en Greenwich. Entonces, si realmente quieres estar en GMT, estás restringido a Islandia y algunos países de África occidental.
Kip
1
El problema con este método es que no funciona con año nuevo, etc.
Daniel Williams
44
@danielWilliams ¿Cómo no funciona esto con un año nuevo? getTime()y setTime()son milisegundos desde la época. No debería importar si el tiempo cruza el límite de un año.
Mashmagar
53

Es algo parecido a esto:

var d = new Date(); // today!
var x = 5; // go back 5 days!
d.setDate(d.getDate() - x);
Chris Nielsen
fuente
La salida de eso me da una larga cadena de enteros. ¿Alguna idea de cómo formatearlo en 14/05/2012?
user525146
77
El valor de retorno de d.setDate es de hecho un valor entero. Sin embargo, probablemente no esté realmente interesado en el valor de retorno en este punto, ya que el valor real de "d" ha sido modificado. Su verdadera pregunta ahora es cómo formatear su fecha, que ahora está en "d" y no el valor de retorno de setDate en absoluto. (Bueno, en realidad es el valor de retorno, pero no es una fecha para ese punto y no deseo confundirlo, solo use d, será más rápido). Para formatear fechas, desea los métodos d.getMonth (), d.getFullYear () y d.getDate (). Desea agregar uno a d.getMonth (), ya que Jan es 0.
Chris Nielsen
2
Como un método simple: function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a};entonces solovar daysAgo45 = getDaysAgo(45);
SpYk3HH
@MiroKrsjak Por supuesto, esto funciona si cruzas el final del mes / principio. ¿Por qué no funcionaría?
Chris Nielsen
23

Noté que getDays + X no funciona durante los límites de día / mes. El uso de getTime funciona siempre que su fecha no sea anterior a 1970.

var todayDate = new Date(), weekDate = new Date();
weekDate.setTime(todayDate.getTime()-(7*24*3600000));
awjr
fuente
3
Me di cuenta de lo mismo. Me sorprende que más no lo haya hecho, ¿o me estoy perdiendo algo?
Sean Glover
11
Esto es incorrecto, la nueva Fecha (). SetDate (-1) le dará el último día del mes anterior.
zbrunson
2
Esto también es incorrecto alrededor del caso de inicio / final del horario de verano. Su enfoque está restando 7 * 24 horas, bajo el supuesto de que cada día tiene 24 horas. El primer día de DST dura solo 23 horas y el último día tiene 25 horas. setDate (getDate () - 7) no tiene este problema.
Kip
1
getTime funciona con el tiempo universal. Por lo tanto, restará correctamente 7 días del objeto Fecha. Cuando lo convierte en una cadena en la zona horaria especificada, mostrará correctamente la hora de esa zona.
awjr
Tenga cuidado con el día de cambio de hora. Cuando retrocedemos en otoño, ese día tiene 25 horas, por lo que restar 24 horas de la medianoche lo llevará al mismo día. Pero esta técnica (restando milisegundos) FUNCIONARÁ si completa el día después de cada operación a la medianoche más cercana. Puede hacerlo agregando primero 12 horas, luego estableciendo las horas a cero.
Magmatic
18

obtener moment.js. Todos los niños geniales lo usan. Tiene más opciones de formato, etc. Donde

var n = 5;
var dateMnsFive = moment(<your date>).subtract(n , 'day');

¡Opcional! Convierte a JS Date obj para enlace angular.

var date = new Date(dateMnsFive.toISOString());

¡Opcional! Formato

var date = dateMnsFive.format("YYYY-MM-DD");
Kentonbmax
fuente
Al pasar su fecha al momento, comenzará a recibir advertencias. Advertencia de desuso: el valor proporcionado no está en un formato RFC2822 o ISO reconocido. la construcción de momento se remonta a js Date (), que no es confiable en todos los navegadores y versiones. Se desaconsejan los formatos de fecha que no sean RFC2822 / ISO y se eliminarán en una próxima versión principal. Consulte momentjs.com/guides/#/warnings/js-date para obtener más información.
Cambie el
13

Hice este prototipo para Date para poder pasar valores negativos para restar días y valores positivos para agregar días.

if(!Date.prototype.adjustDate){
    Date.prototype.adjustDate = function(days){
        var date;

        days = days || 0;

        if(days === 0){
            date = new Date( this.getTime() );
        } else if(days > 0) {
            date = new Date( this.getTime() );

            date.setDate(date.getDate() + days);
        } else {
            date = new Date(
                this.getFullYear(),
                this.getMonth(),
                this.getDate() - Math.abs(days),
                this.getHours(),
                this.getMinutes(),
                this.getSeconds(),
                this.getMilliseconds()
            );
        }

        this.setTime(date.getTime());

        return this;
    };
}

Entonces, para usarlo, simplemente puedo escribir:

var date_subtract = new Date().adjustDate(-4),
    date_add = new Date().adjustDate(4);
Rob Dawley
fuente
2
Puede usar d.setDate(d.getDate() + days)valores positivos y negativos para días para sumar y restar días respectivamente. Y debería funcionar en la instancia (como lo hacen otros métodos de fecha), no crear y devolver una copia.
RobG
13

Algunas de las soluciones existentes estaban cerca, pero no exactamente lo que quería. Esta función funciona con valores positivos o negativos y maneja casos límite.

function addDays(date, days) {
    return new Date(
        date.getFullYear(),
        date.getMonth(),
        date.getDate() + days,
        date.getHours(),
        date.getMinutes(),
        date.getSeconds(),
        date.getMilliseconds()
    );
}
Joel Fillmore
fuente
2
¿se 'pasa' al próximo mes si uso este método para agregar 20 días al 15 del mes actual? No lo parece.
Bora
2
@Bora: sí, incrementa correctamente el mes si es necesario. Por ejemplo, al agregar 20 días al 15 de agosto: addDays (nueva Fecha (2015, 07, 15), 20) devolverá "Vie 04 de septiembre de 2015 00:00:00 GMT-0700 (PDT)"
Joel Fillmore
12

Me gusta hacer las matemáticas en milisegundos. Entonces usaDate.now()

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds

y si te gusta formateado

new Date(newDate).toString(); // or .toUTCString or .toISOString ...

NOTA: Date.now()no funciona en navegadores antiguos (por ejemplo, IE8, creo). Polyfill aquí .

ACTUALIZACIÓN Junio ​​2015

@socketpair señaló mi descuido. Como él / ella dice "Algún día del año tienen 23 horas, y unas 25 debido a las reglas de zona horaria".

Para ampliar eso, la respuesta anterior tendrá imprecisiones de horario de verano en el caso de que desee calcular el día LOCAL hace 5 días en una zona horaria con cambios de horario de verano y usted

  • suponga (erróneamente) que Date.now()le da el tiempo actual LOCAL ahora, o
  • uso .toString()que devuelve la fecha local y, por lo tanto, es incompatible con la Date.now()fecha base en UTC.

Sin embargo, funciona si está haciendo sus matemáticas todo en UTC, por ejemplo

A. Desea la fecha UTC hace 5 días desde NOW (UTC)

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds UTC
new Date(newDate).toUTCString(); // or .toISOString(), BUT NOT toString

B. Comienza con una fecha base UTC distinta de "ahora", utilizando Date.UTC()

newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000;
new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString
poshest
fuente
3
Esto no es preciso. Algún día del año tienen 23 horas, y unas 25 debido a las reglas de zona horaria.
socketpair
Me preocuparía por las condiciones de falla cuando hay segundos de salto ... así que quizás no sea bueno para el código crítico.
robocat
12

Me parece que un problema con el método getDate () / setDate () es que convierte todo fácilmente en milisegundos, y la sintaxis a veces es difícil de seguir.

En cambio, me gusta evitar el hecho de que 1 día = 86,400,000 milisegundos.

Entonces, para su pregunta particular:

today = new Date()
days = 86400000 //number of milliseconds in a day
fiveDaysAgo = new Date(today - (5*days))

Funciona de maravilla.

Uso este método todo el tiempo para hacer cálculos de 30/60/365 días.

Puede extrapolarlo fácilmente para crear unidades de tiempo para meses, años, etc.

Jonathan Bechtel
fuente
11

divida su fecha en partes, luego devuelva una nueva Fecha con los valores ajustados

function DateAdd(date, type, amount){
    var y = date.getFullYear(),
        m = date.getMonth(),
        d = date.getDate();
    if(type === 'y'){
        y += amount;
    };
    if(type === 'm'){
        m += amount;
    };
    if(type === 'd'){
        d += amount;
    };
    return new Date(y, m, d);
}

Recuerde que los meses están basados ​​en cero, pero los días no. es decir, nueva Fecha (2009, 1, 1) == 01 de febrero de 2009, nueva Fecha (2009, 1, 0) == 31 de enero de 2009;

Joshua
fuente
2
¿Qué sucede si agrega, por ejemplo, 50 días a una fecha de esta manera? ¿Fijará la fecha al 68 de agosto de 2009? ¿O está seguro de que esto siempre se ajusta correctamente al mes y / o año apropiado?
Jesper
Lo usé para agregar addDays, addMonths y addYears to Date.prototype. Agradable y simple
Scott Isaacs
1
Esta debería ser la respuesta correcta: funciona incluso el último día del año cuando falla la respuesta aceptada.
kris
No funciona para fechas con años del 1 al 99. ;-) Mucho mejor simplemente usar los métodos get * y set * .
RobG
8

Sin usar la segunda variable, puede reemplazar 7 por su espalda x días:

let d=new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))
vaibhavmaster
fuente
5

function addDays (date, daysToAdd) {
  var _24HoursInMilliseconds = 86400000;
  return new Date(date.getTime() + daysToAdd * _24HoursInMilliseconds);
};

var now = new Date();

var yesterday = addDays(now, - 1);

var tomorrow = addDays(now, 1);

Petr Makarov
fuente
2

He creado una función para la manipulación de la fecha. Puede sumar o restar cualquier número de días, horas, minutos.

function dateManipulation(date, days, hrs, mins, operator) {
   date = new Date(date);
   if (operator == "-") {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() - durationInMs);
   } else {
      var durationInMs = (((24 * days) * 60) + (hrs * 60) + mins) * 60000;
      var newDate = new Date(date.getTime() + durationInMs);
   }
   return newDate;
 }

Ahora, llame a esta función pasando parámetros. Por ejemplo, aquí hay una llamada a la función para obtener la fecha antes de 3 días a partir de hoy.

var today = new Date();
var newDate = dateManipulation(today, 3, 0, 0, "-");
Malvi Panchal
fuente
2

Usa MomentJS .

function getXDaysBeforeDate(referenceDate, x) {
  return moment(referenceDate).subtract(x , 'day').format('MMMM Do YYYY, h:mm:ss a');
}

var yourDate = new Date(); // let's say today
var valueOfX = 7; // let's say 7 days before

console.log(getXDaysBeforeDate(yourDate, valueOfX));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

UtkarshPramodGupta
fuente
1

Las principales respuestas condujeron a un error en mi código donde el primer día del mes establecería una fecha futura en el mes actual. Aquí esta lo que hice,

curDate = new Date(); // Took current date as an example
prvDate = new Date(0); // Date set to epoch 0
prvDate.setUTCMilliseconds((curDate - (5 * 24 * 60 * 60 * 1000))); //Set epoch time
Kishore Avineni
fuente
0

Una manera fácil de administrar las fechas es usar Moment.js

Puedes usar add. Ejemplo

var startdate = "20.03.2014";
var new_date = moment(startdate, "DD.MM.YYYY");
new_date.add(5, 'days'); //Add 5 days to start date
alert(new_date);

Docs http://momentjs.com/docs/#/manipulating/add/

Juan Caicedo
fuente
0

Me gusta lo siguiente porque es una línea. No es perfecto con los cambios de horario de verano, pero generalmente es lo suficientemente bueno para mis necesidades.

var fiveDaysAgo = new Date(new Date() - (1000*60*60*24*5));
ScottE
fuente
0

para mí, todas las combinaciones funcionaron bien con el siguiente código snipplet, el fragmento es para la implementación de Angular-2, si necesita agregar días, pase un número positivo de días, si necesita restar pasar un número negativo de días

function addSubstractDays(date: Date, numberofDays: number): Date {
let d = new Date(date);
return new Date(
    d.getFullYear(),
    d.getMonth(),
    (d.getDate() + numberofDays)
);
}
pritesh agrawal
fuente
0

Obtengo un buen kilometraje desactualizado.

http://www.datejs.com/

d = new Date();
d.add(-10).days();  // subtract 10 days

¡Agradable!

El sitio web incluye esta belleza:

Datejs no solo analiza cadenas, sino que las corta limpiamente en dos

Bret Weinraub
fuente
0

Si desea restar un número de días y formatear su fecha en un formato legible por humanos, debería considerar crear un DateHelperobjeto personalizado que se vea así:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Subtract 5 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), -5));

(ver también este violín )

John Slegers
fuente
0

Vea el siguiente código, reste los días de la fecha actual. Además, configure el mes según la fecha restada.

var today = new Date();
var substract_no_of_days = 25;

today.setTime(today.getTime() - substract_no_of_days* 24 * 60 * 60 * 1000);
var substracted_date = (today.getMonth()+1) + "/" +today.getDate() + "/" + today.getFullYear();

alert(substracted_date);
Manoj Jha
fuente
-1

Al configurar la fecha, la fecha se convierte a milisegundos, por lo que debe volver a convertirla en una fecha:

Este método también tiene en cuenta el cambio de año nuevo, etc.

function addDays( date, days ) {
    var dateInMs = date.setDate(date.getDate() - days);
    return new Date(dateInMs);
}

var date_from = new Date();
var date_to = addDays( new Date(), parseInt(days) );
Daniel Williams
fuente
-1

Puedes usar Javascript.

var CurrDate = new Date(); // Current Date
var numberOfDays = 5;
var days = CurrDate.setDate(CurrDate.getDate() + numberOfDays);
alert(days); // It will print 5 days before today

Para PHP,

$date =  date('Y-m-d', strtotime("-5 days")); // it shows 5 days before today.
echo $date;

Espero que te ayude.

Fénix
fuente
-1

Me convertí a milisegundos y deduje los días que el mes y el año no cambiarán y lógico

var numberOfDays = 10;//number of days need to deducted or added
var date = "01-01-2018"// date need to change
var dt = new Date(parseInt(date.substring(6), 10),        // Year
              parseInt(date.substring(3,5), 10) - 1, // Month (0-11)
              parseInt(date.substring(0,2), 10));
var new_dt = dt.setMilliseconds(dt.getMilliseconds() - numberOfDays*24*60*60*1000);
new_dt = new Date(new_dt);
var changed_date = new_dt.getDate()+"-"+(new_dt.getMonth()+1)+"-"+new_dt.getFullYear();

La esperanza ayuda

hemanjosko
fuente
-1

var date = new Date();
var day = date.getDate();
var mnth = date.getMonth() + 1;

var fDate = day + '/' + mnth + '/' + date.getFullYear();
document.write('Today is: ' + fDate);
var subDate = date.setDate(date.getDate() - 1);
var todate = new Date(subDate);
var today = todate.getDate();
var tomnth = todate.getMonth() + 1;
var endDate = today + '/' + tomnth + '/' + todate.getFullYear();
document.write('<br>1 days ago was: ' + endDate );

belal ahmad
fuente
1
Siempre debe comentar su código / respuesta ya que algunas personas podrían no entender lo que está haciendo
Michael
-1

Uso de la sintaxis de la función JavaScript moderna

const getDaysPastDate = (daysBefore, date = new Date) => new Date(date - (1000 * 60 * 60 * 24 * daysBefore));

console.log(getDaysPastDate(1)); // yesterday

vdegenne
fuente
-1

Intenta algo como esto

dateLimit = (curDate, limit) => {
    offset  = curDate.getDate() + limit
    return new Date( curDate.setDate( offset) )
}

currDate podría ser cualquier fecha

El límite podría ser la diferencia en el número de días (positivo para el futuro y negativo para el pasado)

wahid_abdul
fuente
-1

Esto le dará el resultado de los últimos 10 días 110% de trabajo, no obtendrá ningún tipo de problema

var date = new Date();
var day=date.getDate();
var month=date.getMonth() + 1;
var year=date.getFullYear();
var startDate=day+"/"+month+"/"+year;
var dayBeforeNineDays=moment().subtract(10, 'days').format('DD/MM/YYYY');
startDate=dayBeforeNineDays;
var endDate=day+"/"+month+"/"+year;

puedes cambiar los días de resta de acuerdo a tus requerimientos

Zubair
fuente
-2
var daysToSubtract = 3;
$.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ;
señor Waltmore III
fuente
-2

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 31);

document.write('<br>5 days ago was: ' + d.toLocaleString());

gatlingovind
fuente