Incrementar una fecha en JavaScript

433

Necesito incrementar un valor de fecha en un día en JavaScript.

Por ejemplo, tengo un valor de fecha 2010-09-11 y necesito almacenar la fecha del día siguiente en una variable de JavaScript.

¿Cómo puedo incrementar una fecha por un día?

Santanu
fuente
¿Responde esto a tu pregunta? Agregar días a la fecha de JavaScript
Michael Freidgeim

Respuestas:

792

Tres opciones para ti:

1. Usando solo el Dateobjeto de JavaScript (sin bibliotecas):

Mi respuesta anterior para el n. ° 1 fue incorrecta (agregó 24 horas, al no tener en cuenta las transiciones hacia y desde el horario de verano; Clever Human señaló que fallaría con el 7 de noviembre de 2010 en la zona horaria del Este). En cambio, la respuesta de Jigar es la forma correcta de hacer esto sin una biblioteca:

var tomorrow = new Date();
tomorrow.setDate(tomorrow.getDate() + 1);

Esto funciona incluso durante el último día de un mes (o año), porque el objeto de fecha de JavaScript es inteligente sobre la renovación:

(Esta respuesta se acepta actualmente, por lo que no puedo eliminarla. Antes de que fuera aceptada, le sugerí al OP que aceptaran Jigar's, pero tal vez aceptaron esta para los artículos # 2 o # 3 en la lista).

2. Usando MomentJS :

var today = moment();
var tomorrow = moment(today).add(1, 'days');

(Tenga en cuenta que addmodifica la instancia a la que la llama, en lugar de devolver una nueva instancia, por today.add(1, 'days')lo que modificaría today. Es por eso que comenzamos con una operación de clonación var tomorrow = ...).

3. Usando DateJS , pero no se ha actualizado en mucho tiempo:

var today = new Date(); // Or Date.today()
var tomorrow = today.add(1).day();
TJ Crowder
fuente
Pero tengo la fecha 2010-09-11 en una variable usando document.getElementById ("arrival_date"). Value, muestra una fecha no válida
Santanu
1
@santanu: Ese es un problema completamente diferente: análisis de fechas (obtener una fecha interpretando una cadena). Si ese formato es estático, puede analizarlo usted mismo e introducir los resultados en el Dateconstructor ( new Date(year, month, date)); ver sección 15.9.2.1 de la especificación ; si quieres aceptar una variedad de formatos, definitivamente echa un vistazo a DateJS .
TJ Crowder
1
@santanu: Solo para seguir lo anterior: algunos navegadores pueden analizar ese formato con éxito Date.parse(lo que devuelve una cantidad de milisegundos que luego puede alimentar new Date(ms)). Pero cuidado, eso puede variar de un navegador a otro. Hasta hace poco, las implementaciones podían hacer casi cualquier cosa que quisieran Date.parse. La nueva especificación de la quinta edición ahora tiene un formato mínimo que debe aceptarse, pero todavía no contaría con eso.
TJ Crowder
Solo quería agregar un segundo a una instancia de Date; Esto funcionó para mí x = new Date(); x2 = new Date(x.getTime() + 1000), donde 1000 es un incremento de milisegundos.
berto
1
@piavgh: No hay nada malo con la primera solución, es solo cómo la estás usando. DateLos objetos son mutables. Estás almacenando el mismo Date objeto tres veces en la matriz. Si desea tres Dateobjetos diferentes , debe crear tres objetos:var unavailableDates = []; for (var d = new Date('2017-05-11'); d < new Date('2017-05-13'); d.setDate(d.getDate() + 1)) { unavailableDates.push(new Date(+d)); }
TJ Crowder
178
var myDate = new Date();

//add a day to the date
myDate.setDate(myDate.getDate() + 1);
Jigar Joshi
fuente
Pero tengo la fecha 2010-09-11 en una variable usando document.getElementById ("arrival_date"). Value, muestra una fecha no válida
Santanu
1
@sanatu: en ese caso, debe formatear la cadena de forma que el navegador acepte. Chrome acepta new Date("2009-09-11")pero Firefox no. Creo que la mayoría de los navegadores aceptan, new Date("2009/09/11")por lo que sería una solución fácil var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1);.
David Hedlund
55
Un enfoque más sólido que la sustitución -con /y con la esperanza de que los navegadores lo aceptarán, sería dividir la cadena en partes: var dateParts = arrivalDate.split('-'); var y = parseInt(dateParts[0], 10); var m = parseInt(dateParts[1], 10); var d = parseInt(dateParts[2], 10); var dayAfter = new Date(y, m-1, d+1);Tenga en cuenta que estamos utilizando m-1aquí, porque meses JavaScript son los valores de enumeración (que enero es 0, no 1), y d+1porque ya está haciendo el incremento en la asignación inicial (se corregirá automáticamente el 29 de febrero, etc.)
David Hedlund el
35

Ninguno de los ejemplos en esta respuesta parece funcionar con los días de ajuste del horario de verano. En esos días, el número de horas en un día no es 24 (son 23 o 25, dependiendo de si está "saltando" o "retrocediendo").

La siguiente función AddDays javascript representa el horario de verano:

function addDays(date, amount) {
  var tzOff = date.getTimezoneOffset() * 60 * 1000,
      t = date.getTime(),
      d = new Date(),
      tzOff2;

  t += (1000 * 60 * 60 * 24) * amount;
  d.setTime(t);

  tzOff2 = d.getTimezoneOffset() * 60 * 1000;
  if (tzOff != tzOff2) {
    var diff = tzOff2 - tzOff;
    t += diff;
    d.setTime(t);
  }

  return d;
}

Estas son las pruebas que utilicé para probar la función:

    var d = new Date(2010,10,7);
    var d2 = AddDays(d, 1);
    document.write(d.toString() + "<br />" + d2.toString());

    d = new Date(2010,10,8);
    d2 = AddDays(d, -1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

    d = new Date('Sun Mar 27 2011 01:59:00 GMT+0100 (CET)');
    d2 = AddDays(d, 1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());

    d = new Date('Sun Mar 28 2011 01:59:00 GMT+0100 (CET)');
    d2 = AddDays(d, -1)
    document.write("<hr /><br />" +  d.toString() + "<br />" + d2.toString());
CleverPatrick
fuente
33

La forma más fácil es convertir a milisegundos y agregar 1000 * 60 * 60 * 24 milisegundos, por ejemplo:

var tomorrow = new Date(today.getTime()+1000*60*60*24);
Sylvain Lecorné
fuente
Me encanta esta regla de representación entera.
exebook
Esta es la mejor respuesta. Puede aumentar / disminuir fácilmente tantos días como se solicite; simplemente multiplicando 1000*60*60*24xDaysToBeAdded
Khalil Khalaf
O, new Date(+new Date() + 1000*60*60*24)pero en realidad es similar a getTime()/ setTime(), realmente.
Polv
1
No haga esto a menos que su fecha esté en UTC u otra zona horaria que no tenga horario de verano. De lo contrario, durante 2 días al año, dará resultados inesperados.
ItalyPaleAle
Una new Date(Date.now()+1000*60*60*24);
frase
28

¡Mañana en una línea en JS puro pero es feo !

new Date(new Date().setDate(new Date().getDate() + 1))

Aquí está el resultado:

Thu Oct 12 2017 08:53:30 GMT+0200 (Romance Summer Time)
jpmottin
fuente
14

Primero debe analizar su cadena antes de seguir la sugerencia de otras personas:

var dateString = "2010-09-11";
var myDate = new Date(dateString);

//add a day to the date
myDate.setDate(myDate.getDate() + 1);

Si lo desea nuevamente en el mismo formato, deberá hacerlo "manualmente":

var y = myDate.getFullYear(),
    m = myDate.getMonth() + 1, // january is month 0 in javascript
    d = myDate.getDate();
var pad = function(val) { var str = val.toString(); return (str.length < 2) ? "0" + str : str};
dateString = [y, pad(m), pad(d)].join("-");

Pero sugiero obtener Date.js como se menciona en otras respuestas, eso te ayudará mucho .

einarmagnus
fuente
7

Siento que nada es más seguro que .getTime()y .setTime(), por lo tanto, este debería ser el mejor y el mejor rendimiento también.

const d = new Date()
console.log(d.setTime(d.getTime() + 1000 * 60 * 60 * 24)) // MILLISECONDS

.setDate() para una fecha no válida (como 31 + 1) es demasiado peligroso y depende de la implementación del navegador.

Polv
fuente
5

Obteniendo los próximos 5 días:

var date = new Date(),
d = date.getDate(),
m = date.getMonth(),
y = date.getFullYear();


for(i=0; i < 5; i++){
var curdate = new Date(y, m, d+i)
console.log(curdate)
}
fitodac
fuente
Intenté las respuestas anteriores pero en vano. Tu código funcionó a las mil maravillas. ¡Gracias!
dimmat
4

Dos métodos:

1:

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setTime(a.getTime() + no_of_days * 86400000)

2: similar al método anterior

var a = new Date()
// no_of_days is an integer value
var b = new Date(a.setDate(a.getDate() + no_of_days)
Laksh Goel
fuente
2

Obtenga el valor de cadena de la fecha utilizando el método dateObj.toJSON () Ref: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON Corte la fecha de la devolución valor y luego incremente por la cantidad de días que desee.

var currentdate = new Date();
currentdate.setDate(currentdate.getDate() + 1);
var tomorrow = currentdate.toJSON().slice(0,10);
phil
fuente
Date.toJSON utiliza la zona horaria UTC stackoverflow.com/questions/11382606/…
AndreyP
2
 Date.prototype.AddDays = function (days) {
    days = parseInt(days, 10);
    return new Date(this.valueOf() + 1000 * 60 * 60 * 24 * days);
}

Ejemplo

var dt = new Date();
console.log(dt.AddDays(-30));
console.log(dt.AddDays(-10));
console.log(dt.AddDays(-1));
console.log(dt.AddDays(0));
console.log(dt.AddDays(1));
console.log(dt.AddDays(10));
console.log(dt.AddDays(30));

Resultado

2017-09-03T15:01:37.213Z
2017-09-23T15:01:37.213Z
2017-10-02T15:01:37.213Z
2017-10-03T15:01:37.213Z
2017-10-04T15:01:37.213Z
2017-10-13T15:01:37.213Z
2017-11-02T15:01:37.213Z
swirekx
fuente
Tu código no funciona. Lo probé con el primer console.log () y dice: dt.AddDays () no es una función.
Adrian2895
1

No estoy completamente seguro si es un ERROR (Probado Firefox 32.0.3 y Chrome 38.0.2125.101), pero el siguiente código fallará en Brasil (-3 GMT):

Date.prototype.shiftDays = function(days){    
  days = parseInt(days, 10);
  this.setDate(this.getDate() + days);
  return this;
}

$date = new Date(2014, 9, 16,0,1,1);
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");
$date.shiftDays(1);
console.log($date+"");

Resultado:

Fri Oct 17 2014 00:01:01 GMT-0300
Sat Oct 18 2014 00:01:01 GMT-0300
Sat Oct 18 2014 23:01:01 GMT-0300
Sun Oct 19 2014 23:01:01 GMT-0200

Agregar una hora a la fecha hará que funcione perfectamente (pero no resuelve el problema).

$date = new Date(2014, 9, 16,0,1,1);

Resultado:

Fri Oct 17 2014 01:01:01 GMT-0300
Sat Oct 18 2014 01:01:01 GMT-0300
Sun Oct 19 2014 01:01:01 GMT-0200
Mon Oct 20 2014 01:01:01 GMT-0200
Alan Weiss
fuente
1

Resultados en una representación de cadena de la fecha de mañana. Use la nueva Fecha () para obtener la fecha de hoy, agregue un día usando Date.getDate () y Date.setDate () y convierta el objeto Date en una cadena.

  const tomorrow = () => {
      let t = new Date();
      t.setDate(t.getDate() + 1);
      return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(
        t.getDate()
      ).padStart(2, '0')}`;
    };
    tomorrow();
Gor
fuente
1

Incrementando el año de la fecha con vanilla js:

start_date_value = "01/01/2019"
var next_year = new Date(start_date_value);
next_year.setYear(next_year.getYear() + 1);
console.log(next_year.getYear()); //=> 2020

En caso de que alguien quiera incrementar otro valor que no sea la fecha (día)

d1jhoni1b
fuente
1

A través de JS nativo, para agregar un día, puede hacer lo siguiente:

let date = new Date(); // today
date.setDate(date.getDate() + 1) // tomorrow

Otra opción es usar la momentbiblioteca:

const date = moment().add(14, "days").toDate()
Kiran Debnath
fuente
1
Por favor explique lo que hace este código. Agregue detalles sobre cómo aborda el problema del OP.
Yash
1

Incremento de fecha de ahorro de zona horaria / horario de verano para fechas de JavaScript:

function nextDay(date) {
    const sign = v => (v < 0 ? -1 : +1);
    const result = new Date(date.getTime());
    result.setDate(result.getDate() + 1);
    const offset = result.getTimezoneOffset();
    return new Date(result.getTime() + sign(offset) * offset * 60 * 1000);
}
Peter Marklund
fuente