Incrémenter une date en JavaScript


Réponses:


792

Trois options pour vous:

1. En utilisant uniquement l' Dateobjet JavaScript (pas de bibliothèques):

Ma réponse précédente pour # 1 était fausse (elle a ajouté 24 heures, ne tenant pas compte des transitions vers et depuis l'heure d'été; Clever Human a souligné qu'elle échouerait avec le 7 novembre 2010 dans le fuseau horaire de l'Est). Au lieu de cela, la réponse de Jigar est la bonne façon de le faire sans bibliothèque:

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

Cela fonctionne même pour le dernier jour d'un mois (ou d'une année), car l'objet de date JavaScript est intelligent pour le survol:

(Cette réponse est actuellement acceptée, je ne peux donc pas la supprimer. Avant qu'elle ne soit acceptée, j'ai suggéré au PO d'accepter les Jigar, mais peut-être ont-ils accepté celle-ci pour les éléments n ° 2 ou n ° 3 de la liste.)

2. Utilisation de MomentJS :

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

(Méfiez-vous qui addmodifie l'instance sur laquelle vous l'appelez, plutôt que de renvoyer une nouvelle instance, donc la today.add(1, 'days')modifierait today. C'est pourquoi nous commençons par une opération de clonage activée var tomorrow = ....)

3. Utilisation de DateJS , mais il n'a pas été mis à jour depuis longtemps:

var today = new Date(); // Or Date.today()
var tomorrow = today.add(1).day();

Mais j'ai la date 2010-09-11 dans une variable en utilisant la valeur document.getElementById ("arrivée_date")., Il montre une date invalide
Santanu

1
@santanu: C'est un problème complètement différent: analyse de date (obtenir une date en interprétant une chaîne). Si ce format est statique, vous pouvez l'analyser vous-même et alimenter les résultats dans le Dateconstructeur ( new Date(year, month, date)); voir la section 15.9.2.1 de la spécification ; si vous souhaitez accepter une gamme de formats, jetez un coup d'œil à DateJS .
TJ Crowder

1
@santanu: Juste pour suivre ce qui précède: Certains navigateurs peuvent réussir à analyser ce format avec Date.parse(ce qui renvoie un certain nombre de millisecondes que vous pouvez ensuite alimenter new Date(ms)). Mais attention, cela peut varier d'un navigateur à l'autre. Jusqu'à récemment, les implémentations pouvaient faire à peu près tout ce qu'elles voulaient Date.parse. La nouvelle spécification de la 5e édition a maintenant un format minimum qui doit être accepté, mais je ne compterais pas encore là-dessus.
TJ Crowder

Je voulais juste ajouter une seconde à une instance de Date; cela a fonctionné pour moi x = new Date(); x2 = new Date(x.getTime() + 1000), où 1000 est un incrément de milliseconde.
berto

1
@piavgh: Il n'y a rien de mal avec la première solution, c'est juste la façon dont vous l'utilisez. Dateles objets sont mutables. Vous stockez le même Date objet trois fois dans le tableau. Si vous voulez trois Dateobjets différents , vous devez créer trois objets: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);

Mais j'ai la date 2010-09-11 dans une variable en utilisant la valeur document.getElementById ("arrivée_date")., Il montre une date invalide
Santanu

1
@sanatu: Dans ce cas, vous devez formater la chaîne d'une manière que le navigateur acceptera. Chrome accepte new Date("2009-09-11")mais Firefox ne le fait pas. Je pense que la plupart des navigateurs acceptent new Date("2009/09/11")une solution simple var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1);.
David Hedlund

5
Une approche plus solide que de remplacer -par /et en espérant que les navigateurs l'accepteront, serait de diviser la chaîne en parties: 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);Notez que nous utilisons m-1ici, car les mois javascript sont des valeurs énumérées (janvier étant 0, pas 1), et d+1parce que nous fais l'incrémentation déjà dans l'affectation initiale (cela corrigera automatiquement le 29 février, etc.)
David Hedlund

35

Aucun des exemples de cette réponse ne semble fonctionner avec les jours d'ajustement de l'heure d'été. Ces jours-là, le nombre d'heures dans une journée n'est pas de 24 (ils sont de 23 ou 25, selon que vous «sautez en avant» ou «reculez».)

La fonction javascript AddDays ci-dessous représente l'heure d'été:

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

Voici les tests que j'ai utilisés pour tester la fonction:

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

33

Le moyen le plus simple est de convertir en millisecondes et d'ajouter 1000 * 60 * 60 * 24 millisecondes, par exemple:

var tomorrow = new Date(today.getTime()+1000*60*60*24);

J'adore celui-ci, la règle de représentation entière.
exebook

C'est la meilleure réponse. Peut incrémenter / décrémenter facilement autant de jours que demandé; juste en multipliant 1000*60*60*24xDaysToBeAdded
Khalil Khalaf

Ou,, new Date(+new Date() + 1000*60*60*24)mais c'est vraiment similaire à getTime()/ setTime(), vraiment.
Polv

1
Ne faites cela que si votre date est en UTC ou dans un autre fuseau horaire qui ne dispose pas d'heure d'été. Sinon, pendant 2 jours par an, cela donnera des résultats inattendus.
ItalyPaleAle

Un new Date(Date.now()+1000*60*60*24);
aller simple

28

Demain en une seule ligne en pur JS mais c'est moche !

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

Voici le résultat:

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

14

Vous devez d'abord analyser votre chaîne avant de suivre la suggestion des autres:

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

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

Si vous le souhaitez à nouveau dans le même format, vous devrez le faire "manuellement":

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

Mais je suggère d'obtenir Date.js comme mentionné dans d'autres réponses, cela vous aidera beaucoup .


7

Je pense que rien n'est plus sûr .getTime()et .setTime(), donc ce devrait être le meilleur, et aussi performant.

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

.setDate() pour une date invalide (comme 31 + 1) est trop dangereux et cela dépend de l'implémentation du navigateur.


5

Obtenir les 5 prochains jours:

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

J'ai essayé les réponses ci-dessus mais en vain. Votre code a fonctionné comme un charme. Merci!
dimmat

4

Deux méthodes:

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: similaire à la méthode précédente

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

2

Obtenez la valeur de chaîne de la date à l'aide de la méthode dateObj.toJSON () Réf: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON Découpez la date à partir du retour puis incrémentez du nombre de jours souhaité.

var currentdate = new Date();
currentdate.setDate(currentdate.getDate() + 1);
var tomorrow = currentdate.toJSON().slice(0,10);

Date.toJSON utilise le fuseau horaire 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);
}

Exemple

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

Résultat

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

Votre code ne fonctionne pas. Je l'ai essayé avec le premier console.log () et il dit: dt.AddDays () n'est pas une fonction.
Adrian2895

1

Je ne sais pas exactement s'il s'agit d'un BUG (testé Firefox 32.0.3 et Chrome 38.0.2125.101), mais le code suivant échouera sur le Brésil (-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+"");

Résultat:

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

L'ajout d'une heure à la date le fera fonctionner parfaitement (mais ne résout pas le problème).

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

Résultat:

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

1

Résultats dans une représentation sous forme de chaîne de la date de demain. Utilisez new Date () pour obtenir la date du jour, en ajoutant un jour à l'aide de Date.getDate () et Date.setDate () et en convertissant l'objet Date en chaîne.

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

1

Incrémentation de l'année de la date avec 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

Juste au cas où quelqu'un voudrait incrémenter une autre valeur que la date (jour)


1

Via JS natif, pour ajouter un jour, vous pouvez faire ce qui suit:

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

Une autre option consiste à utiliser la momentbibliothèque:

const date = moment().add(14, "days").toDate()

1
Veuillez expliquer ce que fait ce code. Ajoutez des détails sur la façon dont il résout le problème du PO.
Yash

1

Incrément de date prenant en compte le fuseau horaire / l'heure d'été pour les dates 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);
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.