544 votes

Incrémenter une date en JavaScript

J'ai besoin d'incrémenter une valeur de date d'un jour en JavaScript.

Par exemple, j'ai une valeur de date 2010-09-11 et je dois stocker la date du jour suivant dans une variable JavaScript.

Comment puis-je incrémenter une date d'un jour ?

0 votes

Cela répond-il à votre question ? Ajouter des jours à la date JavaScript

959voto

T.J. Crowder Points 285826

Trois options pour vous :

1. En utilisant uniquement le langage JavaScript Date (aucune bibliothèque) :

Ma réponse précédente pour le numéro 1 était erronée (elle ajoutait 24 heures, sans tenir compte des transitions vers et depuis l'heure d'été) ; Humain malin a fait remarquer qu'il échouerait avec le 7 novembre 2010 dans le fuseau horaire de l'Est). Au lieu de cela, La réponse de Jigar est la manière correcte de faire cela sans bibliothèque :

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

(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 celle de Jigar, mais peut-être ont-ils accepté celle-ci pour les points n°2 ou n°3 de la liste).

2. Utilisation de MomentJS :

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

(Attention add modifie l'instance sur laquelle vous l'appelez, plutôt que de retourner une nouvelle instance, donc today.add('days', 1) modifierait today . C'est pourquoi nous commençons par une opération de clonage sur 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();

0 votes

Mais j'ai la date 2010-09-11 dans une variable en utilisant document.getElementById("arrival_date").value, il montre une date invalide.

1 votes

@santanu : C'est un problème complètement différent : l'analyse de la date (obtenir une date en interprétant une chaîne). Si ce format est statique, vous pouvez l'analyser vous-même et introduire les résultats dans la méthode d'analyse de la date. Date constructeur ( new Date(year, month, date) ) ; voir la section 15.9.2.1 de la directive sur la protection des données. spécification Si vous souhaitez accepter un large éventail de formats, jetez un coup d'oeil à DateJS .

1 votes

@santanu : Juste pour faire suite à ce qui précède : Certains navigateurs peuvent analyser ce format avec succès avec Date.parse (qui renvoie un nombre de millisecondes que vous pouvez ensuite introduire dans la fonction 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 dans le fichier Date.parse . La nouvelle spécification de la 5e édition prévoit désormais un format minimum qui doit être accepté, mais je ne compterais pas encore là-dessus.

196voto

Jigar Joshi Points 116533
var myDate = new Date();

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

0 votes

Mais j'ai la date 2010-09-11 dans une variable en utilisant document.getElementById("arrival_date").value, il montre une date invalide.

1 votes

@sanatu : Dans ce cas, vous devez formater la chaîne de caractères de manière à ce que le navigateur l'accepte. 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 serait donc var arrivalDate = document.getElementById('arival_date').value; var dayAfter = new Date(arrival_date.replace(/-/g, '/')); dayAfter.setDate(dayAfter.getDate()+1); .

6 votes

Une approche plus solide que le remplacement - con / et espérer que les navigateurs l'acceptent, serait de diviser la chaîne en plusieurs 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-1 ici, car les mois en javascript sont des valeurs d'énumération (janvier étant 0, pas 1), et d+1 parce que nous faisons déjà l'incrémentation dans l'affectation initiale (il corrigera automatiquement pour le 29 février, etc.).

38voto

Clever Human Points 3174

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 (il est de 23 ou 25, selon que l'on "avance" ou que l'on "recule").

La fonction javascript AddDays ci-dessous tient compte de 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());

15voto

einarmagnus Points 1716

Vous devez d'abord analyser votre chaîne avant de suivre les suggestions 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 voulez le remettre 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 .

1voto

Alan Weiss Points 14

Je ne suis pas tout à fait sûr qu'il s'agisse d'un bug (testé sur Firefox 32.0.3 et Chrome 38.0.2125.101), mais le code suivant échoue au 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

Ajouter une heure à la date, la 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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X