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.


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


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());


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/


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);

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));

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");

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);

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()
    );
}

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

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.


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;


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))

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);


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, "-");

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>


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


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));

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)
);
}

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


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 )


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);

-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) );

-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.


-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


-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 );


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


-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)


-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



-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());

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.