Ajouter des jours à la date JavaScript

1097

Comment ajouter des jours au courant en Dateutilisant JavaScript. JavaScript a-t-il une fonction intégrée comme .Net AddDay?

Ashesh
la source

Réponses:

1212

Vous pouvez en créer un avec: -

Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

var date = new Date();

alert(date.addDays(5));

Cela prend soin d'incrémenter automatiquement le mois si nécessaire. Par exemple:

8/31 + 1 jour deviendra 9/1 .

Le problème avec l'utilisation setDatedirecte est qu'il s'agit d'un mutateur et qu'il vaut mieux éviter ce genre de chose. L'ECMA a jugé bon de traiter Datecomme une classe mutable plutôt que comme une structure immuable.

AnthonyWJones
la source
17
Simplifié:Date.prototype.addDays=function(d){return new Date(this.valueOf()+864E5*d);};
Duncan
27
@Duncan Êtes-vous sûr que c'est la même chose que ci-dessus? Celui-ci ajoute simplement 24 heures, mais un jour n'est pas toujours 24 heures . Je suppose que la question est de savoir comment incrémenter la partie date d'un jour, sans changer la partie temps.
Tamás Bolvári
88
864E5pour une raison quelconque, je préfère écrire 24*60*60dans mon code :)
Mars Robertson
62
Les gars, n'utilisez pas la méthode d'ajout de 864E5 car cela ne prend pas de différence d'heure d'été où les jours peuvent être de 23 ou 25 heures.
sbrbot
12
Pour ceux d'entre vous qui s'inquiètent de l'heure d'été - ne le faites pas. Ces algorithmes modifient la date sous-jacente, pas la façon dont la date est interprétée. L'heure d'été est implémentée dans les getters et les setters de la date - les getters pour soustraire une heure en été, et le setter pour ajouter cette heure en arrière pendant l'été pour normaliser l'heure. Mais seulement lorsque vous utilisez une heure absolue - les heures relatives n'ont pas besoin d'être interprétées. C'est pourquoi les mathématiques de date fonctionnent. À mon humble avis
Gerard ONeill
755

Bonne réponse :

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

Réponse incorrecte :

Cette réponse fournit parfois le résultat correct mais renvoie très souvent la mauvaise année et le mauvais mois. La seule fois où cette réponse fonctionne, c'est lorsque la date à laquelle vous ajoutez des jours se trouve avoir l'année et le mois en cours.

// Don't do it this way!
function addDaysWRONG(date, days) {
  var result = new Date();
  result.setDate(date.getDate() + days);
  return result;
}

Preuve / exemple

Vérifiez ce JsFiddle

pièces de rechange
la source
@bzlm, oui essentiellement la même chose. Cela ne modifie tout simplement pas le prototype Date. Je voulais également souligner les défauts de la réponse principale.
sparebytes
La réponse acceptée a été modifiée il y a quinze jours pour souligner ses défauts. Pensez-vous qu'il a besoin de modifications supplémentaires? Si c'est le cas, comment?
bzlm
7
@bzlm: Oui, je pense que la note devrait se lire "cette approche échoue si la date" à partir de "n'est pas dans la même année ou le même mois que la date actuelle ". Je crains toujours que les utilisateurs ne regardent la réponse et ne lisent pas l'avertissement car il ne se démarque pas. Merci.
sparebytes
3
Je pense que même si ce travail n'est pas correct. Il n'y a pas un tel constructeur pour Date: var result = new Date (date); , voir http://www.w3schools.com/js/js_dates.asp . Même si cela fonctionne généralement, cela peut parfois conduire à de mauvais résultats en raison de la conversion en chaîne et vice versa. Il doit s'agir de var result = new Date (date.getTime ());
Marcin
2
@AnkitBalyan, Voir d'autres réponses. Il peut ne pas fonctionner correctement en raison de l'heure d'été
sparebytes
188
var today = new Date();
var tomorrow = new Date();
tomorrow.setDate(today.getDate()+1);

Soyez prudent, car cela peut être délicat. Lorsque vous définissez "demain", cela ne fonctionne que parce que sa valeur actuelle correspond à l'année et au mois pour "aujourd'hui". Cependant, la définition d'un numéro de date tel que "32" fonctionnera normalement très bien pour le déplacer vers le mois suivant.

Joel Coehoorn
la source
1
Ouais? Mais qu'est-ce que c'est? (couru le 31 mars 2010): aujourd'hui = nouvelle date (); demain = nouvelle date (); demain.setDate (aujourd'hui.getDate () + 1); alerte (demain.getMonth ()); Dit "3". alerte (demain); est correct ... Pourquoi ???
d -_- b
12
@sims month est 0 indexé. Le mois 3 est avril
Joel Coehoorn
7
Pourquoi la nécessité de créer 2 objets de date distincts? Pourquoi ne pas utiliser simplement le même objet date: var d = new Date(); d.setDate( d.getDate() + 1 );?
Joseph Silber
8
Cette approche ne fonctionne pas sur plusieurs années. Si votre date de début date d'il y a quelques années, getDate()renvoie le jour de cette année . Ensuite, l'appel setDatedéfinit le jour de l' année en cours . Ce n'est donc PAS une bonne solution générale. La réponse de @ AnthonyWJones fonctionne réellement correctement.
Drew Noakes du
3
@ DrewNoakes - votre affirmation selon laquelle cela ne fonctionne pas sur plusieurs années est fausse. getDate renvoie le jour du mois, pas le "jour de cette année". Par exemple, le var d = new Date(2015,11,30);d.setDate(d.getDate() + 370)3 janvier 2017 qui s'étale sur 2 ans.
RobG
124

Ma solution simple est:

nextday=new Date(oldDate.getFullYear(),oldDate.getMonth(),oldDate.getDate()+1);

cette solution n'a pas de problème avec l'heure d'été. En outre, on peut ajouter / sous-compenser n'importe quel décalage pendant des années, des mois, des jours, etc.

day=new Date(oldDate.getFullYear()-2,oldDate.getMonth()+22,oldDate.getDate()+61);

est le bon code.

sbrbot
la source
13
Remarque: cela réinitialise l'heure à 00:00:00 (peut être un problème ou non)
Álvaro González
Ne fonctionne pas le dernier jour d'un mois, comme vous le dites. Rend cela inutilisable 12 jours par an. Cela ressemble à un cauchemar à déboguer !!!
Drew Noakes du
6
Non Drew, il est utilisable tous les jours de l'année. Vous pouvez mettre un décalage de date supérieur à 31 ou un décalage de mois supérieur à 12 et cette fonction le recalculera en tant que jour du mois suivant ou du mois de l'année prochaine. Ainsi, par exemple: nextday = new Date (oldDate.getFullYear (), oldDate.getMonth (), oldDate.getDate () + 40); est parfaitement bien codé.
sbrbot
il y a getMonth () + 22 - ce que vous pensez que ça va marcher!?
sbrbot
1
J'accepte, utilisez cette façon. Nous avons juste eu un bug à cause de l'heure d'été parce que nous l'utilisions setDate.
Jelle
95

Ces réponses me paraissent déroutantes, je préfère:

var ms = new Date().getTime() + 86400000;
var tomorrow = new Date(ms);

getTime () nous donne des millisecondes depuis 1970, et 86400000 est le nombre de millisecondes par jour. Par conséquent, ms contient des millisecondes pour la date souhaitée.

L'utilisation du constructeur en millisecondes donne l'objet de date souhaité.

Jason
la source
46
Cette solution ne prend pas en compte l'heure d'été. Ainsi, par exemple, cela reviendra à la même date, 23 heures plus tard: new Date(new Date('11/4/2012').getTime() + 86400000)
Noah Harrison
6
@NoahMiller Le problème que vous évoquez pourrait être une fonctionnalité et non un bug! Ajouter 24 heures par jour est parfois la bonne chose à faire, dans le but de connaître l'heure résultante en fonction de l'heure d'été. La date de retour de votre exemple a une valeur d'heure de 23 heures le 4 novembre, ce qui correspond à 24 heures plus tard ce jour-là. L'affiche originale posait des questions sur la date et l'heure, ce qui semblerait indiquer un certain désir de connaître l'heure exacte de la journée. Cette réponse est correcte si vous êtes dans le cas où votre objectif est le temps 24 heures plus tard.
Andy Novocin
3
Je suis d'accord Noah, var d2 = new Date (d1.valueOf () + 24 * 60 * 60 * 1000) fait ce qu'il dit, ajoute une journée entière de ticks à une date.
Corey Alix
6
C'est absolument correct dans certains cas (par exemple pour les cookies 1 jour) et une solution plus simple que la plupart des autres. Je ne comprends pas pourquoi il y a tant de downvotes et si peu de upvotes: /
Matmarbon
48

Essayer

var someDate = new Date();
var duration = 2; //In Days
someDate.setTime(someDate.getTime() +  (duration * 24 * 60 * 60 * 1000));

L'utilisation de setDate () pour ajouter une date ne résoudra pas votre problème, essayez d'ajouter quelques jours à un mois de février, si vous essayez d'ajouter de nouveaux jours, cela n'entraînera pas ce que vous attendiez.

sufyan.shoaib
la source
26
Non, cela ne doit pas être marqué comme la bonne réponse car cette solution suppose que chaque jour a 24 * 60 * 60 * 1000 secondes mais ce n'est pas le cas (heure d'été)!
sbrbot
Des preuves du problème de «février» avec setDate()? Est-ce ceci: stackoverflow.com/questions/5497637/…
nobar
9
+1 Ceci DEVRAIT être marqué comme la bonne réponse. Je crois que «l'heure d'été» concerne la présentation et non la valeur , qui est simplement le nombre de millisecondes. Du point de vue valeur - le jour est le nombre CONST de millisecondes, alors qu'en termes de présentation il peut varier.
tombé
1
@ disfated — ce n'est pas la bonne réponse. Le jour qui passe à l'heure d'été a 25 heures, mais cette méthode n'ajoute que 24, la date sera donc la même. L'utilisation de 24 heures pour représenter une journée fonctionne si des méthodes UTC sont utilisées à la place, mais pourquoi s'embêter lors de l'utilisation de setDate est plus pratique? ;-)
RobG
38

Je viens de passer des heures à essayer de comprendre ce que l'accord avec l'année n'a pas ajouté en suivant les exemples principaux ci-dessous.

Si vous voulez simplement ajouter n jours à la date que vous avez, il vaut mieux y aller:

myDate.setDate (myDate.getDate () + n);

ou la version longue

var theDate = new Date(2013, 11, 15);
var myNewDate = new Date(theDate);
myNewDate.setDate(myNewDate.getDate() + 30);
console.log(myNewDate);

Ce truc aujourd'hui / demain est déroutant. En définissant la date actuelle dans votre nouvelle variable de date, vous gâcherez la valeur de l'année. si vous travaillez à partir de la date d'origine, vous ne le ferez pas.

Rumpleteaser
la source
7
En lisant toutes les réponses jusqu'à ce que je trouve ce bijou ici. Maintenant, cela a du sens. Incroyable que la chose aujourd'hui / demain ait été copiée dans presque toutes les réponses, alors que cela n'a aucun sens et que ce n'est pas "pour la lisibilité et la clarté" comme le dit l'auteur dans la réponse la plus votée - dans le commentaire le plus voté -, c'est déroutant et une mauvaise pratique et mal
Cesc
23

Si vous le pouvez, utilisez moment.js . JavaScript n'a pas de très bonnes méthodes de date / heure natives. Voici un exemple de syntaxe de Moment:

var nextWeek = moment().add(7, 'days');
alert(nextWeek);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment-with-locales.min.js"></script>

Référence: http://momentjs.com/docs/#/manipulating/add/

user2910265
la source
1
@ kpull1, le demandeur n'a pas restreint le domaine de la solution en demandant s'il existe une solution intégrée.
user2910265
4
Note moderne: Moment.js est incroyablement lourd à ajouter pour un si petit objectif. Il fait plusieurs centaines de Ko et n'est pas compatible avec les packs Web.
Joshua Comeau
1
Notre bibliothèque préférée est date-fns. Webpack-friendly, rapide et traite les dates comme immuables.
Freewalker
1
@LukeWilliams n'a jamais entendu parler de date-fns jusqu'à présent. va le vérifier. Merci.
user2910265
2
@JoshuaComeau Si vous le téléchargez à partir de cdnjs.cloudflare.com/ajax/libs/moment.js/2.19.3/moment.min.js , cela prend 53 248 octets sur le disque. J'imagine que c'est toute la boule de cire, mais je ne sais pas. Quoi qu'il en soit. Ce n'est pas grave.
birdus
22
int days = 1;
var newDate = new Date(Date.now() + days * 24*60*60*1000);

CodePen

var days = 2;
var newDate = new Date(Date.now() + days * 24*60*60*1000);

document.write('Today: <em>');
document.write(new Date());
document.write('</em><br/> New: <strong>');
document.write(newDate);

Serge
la source
2
Votez pour ne pas avoir besoin d'une variable de date intermédiaire.
Jeff Lowery
c'est la meilleure réponse car elle n'a pas de mutation
knocte
Tous les jours n'ont pas 24h, il échoue pour l'heure d'été et les secondes intercalaires.
Stephan
19

J'ai créé ces extensions hier soir:
vous pouvez passer des valeurs positives ou négatives;

exemple:

var someDate = new Date();
var expirationDate = someDate.addDays(10);
var previous = someDate.addDays(-5);


Date.prototype.addDays = function (num) {
    var value = this.valueOf();
    value += 86400000 * num;
    return new Date(value);
}

Date.prototype.addSeconds = function (num) {
    var value = this.valueOf();
    value += 1000 * num;
    return new Date(value);
}

Date.prototype.addMinutes = function (num) {
    var value = this.valueOf();
    value += 60000 * num;
    return new Date(value);
}

Date.prototype.addHours = function (num) {
    var value = this.valueOf();
    value += 3600000 * num;
    return new Date(value);
}

Date.prototype.addMonths = function (num) {
    var value = new Date(this.valueOf());

    var mo = this.getMonth();
    var yr = this.getYear();

    mo = (mo + num) % 12;
    if (0 > mo) {
        yr += (this.getMonth() + num - mo - 12) / 12;
        mo += 12;
    }
    else
        yr += ((this.getMonth() + num - mo) / 12);

    value.setMonth(mo);
    value.setYear(yr);
    return value;
}
mark.nino.chua
la source
7
La méthode .addDays () ne fonctionne pas pour les dates qui traversent les limites d'heure d'été.
mskfisher
1
C'est l'une des meilleures réponses ici parce que vous utilisez (correctement) le nombre de millis depuis l'epoc pour représenter les dates / heures, et ajoutez des quantités de millis pour les ajustements ... Pourquoi alors n'avez-vous pas gardé cela pour "addMonths"! ? Et pourquoi ne pas ajouter d'année? Vous êtes-vous ennuyé?
Robin
Outre les mois, les périodes peuvent être représentées par des nombres statiques. Mais les mois peuvent être de quatre longueurs différentes. En outre, toute longueur de période de jours et plus peut avoir une longueur variable à l'heure d'été, vous ne pouvez donc plus utiliser l'ajout basé sur le temps sans un autre niveau de complexité. J'ai ajouté addYears () et j'ai corrigé addMonths ().
Suamere
14

Sans utiliser la deuxième variable, vous pouvez remplacer 7 par vos x prochains jours:

let d=new Date(new Date().getTime() + (7 * 24 * 60 * 60 * 1000));
vaibhavmaster
la source
14

soustraire 30 jours d'utilisation (24h = 86400000ms)

new Date(+yourDate - 30 *86400000)

Kamil Kiełczewski
la source
Lorsque vous essayez de calculer la date et l'heure, rappelez-vous toujours que la date et l'heure sont basées sur des millisecondes en informatique, ( en.wikipedia.org/wiki/System_time#Retrieving_system_time ) new Date (+ yourDate + 30 * (24 * 60 * 60 * 1000))
Ashraf Abusada
13

La solution la plus simple.

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

 // and then call

 var newDate = new Date().addDays(2); //+2 days
 console.log(newDate);

 // or

 var newDate1 = new Date().addDays(-2); //-2 days
 console.log(newDate1);

ampachts
la source
Je pense que c'est la meilleure solution. Si nous étendons la classe Date, il est plus logique que l'instance Date soit elle-même mise à jour.
Porlune
10

Merci Jason pour votre réponse qui fonctionne comme prévu, voici un mélange de votre code et du format pratique d'AnthonyWJones:

Date.prototype.addDays = function(days){
    var ms = new Date().getTime() + (86400000 * days);
    var added = new Date(ms);
    return added;
}
Olivier
la source
6
Il ne prend pas en compte l'heure d'été lorsqu'il y a plus ou moins de 86 400 000 secondes dans une journée et peut entraîner une erreur logique (bogue de programme) dans votre code.
sbrbot
Parfois, c'est nécessaire. L'API eBay propose des enchères de x jours qui sont basées sur 24 heures, de sorte que votre article se terminera à une heure différente de celle qui augmente si le statut de l'heure d'été change en cours d'enchère. Dans ce cas, vous devez utiliser ce type de fonction pour éviter les erreurs logiques.
Andy Novocin
10

Tard dans la soirée, mais si vous l'utilisez, jQueryil existe un excellent plugin appelé Moment:

http://momentjs.com/

var myDateOfNowPlusThreeDays = moment().add(3, "days").toDate();

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

Et plein d'autres bonnes choses là-dedans!

Edit: référence jQuery supprimée grâce au commentaire d'Aikeru

RemarkLima
la source
1
moment n'a pas besoin de jQuery :)
aikeru
Encore mieux dans ce cas !!
RemarkLima
1
Oui, après avoir été trop longtemps avec Plain ol 'JS, j'ai utilisé Moment, et ça marche (tm)!
caseyamcl
Pourquoi voudriez-vous utiliser le plugin alors que quelques lignes de JS feront l'affaire?
frenchie
@frenchie parce que, ce qui commence par quelques lignes de JS et parce que votre application manipule clairement les informations relatives aux jours, dates et heures, ce sera bientôt quelques 1000 lignes de JS, alors il vous sera demandé de localiser l'application sur 12 langues et fuseaux horaires et vous auriez souhaité avoir commencé avec quelque chose comme le moment;)
RemarkLima
10

Une solution conçue pour l' exploitant du pipeline :

const addDays = days => date => {
  const result = new Date(date);

  result.setDate(result.getDate() + days);

  return result;
};

Usage:

// Without the pipeline operator...
addDays(7)(new Date());

// And with the pipeline operator...
new Date() |> addDays(7);

Si vous avez besoin de plus de fonctionnalités, je vous suggère de regarder dans les date-fns bibliothèque .

sdgfsdh
la source
8

Vieux je sais, mais parfois j'aime ça:

function addDays(days) {
    return new Date(Date.now() + 864e5 * days);
}
Todd
la source
2
Celui-ci a le plus de sens pour moi. C'est simple, élégant et ne tombe pas en priant pour les problèmes évoluant au fil des mois / années.
uadrive
1
Réponse la plus simple présentée. En s'appuyant sur cela, le prototype «addDays» serait le suivant:Date.prototype.addDays = function(days) {return new Date(this.getTime() + (864e5 * days));};
CrazyIvan1974
Tous les jours n'ont pas 24h, il échoue pour l'heure d'été et les secondes intercalaires.
Stephan
8

J'ai eu des problèmes avec l'heure d'été avec la solution proposée.

En utilisant getUTCDate/ à la setUTCDateplace, j'ai résolu mon problème.

// Curried, so that I can create helper functions like `add1Day`
const addDays = num => date => {
  // Make a working copy so we don't mutate the supplied date.
  const d = new Date(date);

  d.setUTCDate(d.getUTCDate() + num);

  return d;
}
Joshua Comeau
la source
8

Vous pouvez utiliser JavaScript, aucune jQuery requise:

var someDate = new Date();
var numberOfDaysToAdd = 6;
someDate.setDate(someDate.getDate() + numberOfDaysToAdd); 
Formatting to dd/mm/yyyy :

var dd = someDate.getDate();
var mm = someDate.getMonth() + 1;
var y = someDate.getFullYear();

var someFormattedDate = dd + '/'+ mm + '/'+ y;
Rohit.007
la source
8

Prototype générique sans variable, il s'applique sur une valeur Date existante:

Date.prototype.addDays = function (days) {
    return new Date(this.valueOf() + days * 864e5);
}
Matteo Conta
la source
7

Les documents mozilla pour setDate () n'indiquent pas qu'il gérera les scénarios de fin de mois. Voir https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Date

régler la date()

  • Définit le jour du mois (1-31) pour une date spécifiée en fonction de l'heure locale.

C'est pourquoi j'utilise setTime () lorsque j'ai besoin d'ajouter des jours.

Blake Mills
la source
Je voudrais
Blake Mills
1
Les " documents mozilla pour setDate () n'indiquent pas qu'il gérera les scénarios de fin de mois ". Les "documents" ont été mis à jour maintenant. ;-)
RobG
7

Aussi simple que cela:

new Date((new Date()).getTime() + (60*60*24*1000));
Dila Gurung
la source
2
Bien que cela ajoute des jours UTC, il utilise des méthodes locales et n'autorise pas les jours locaux qui ne durent pas 24 heures, ce qui se produit lorsque le décalage du fuseau horaire change (par exemple, dans et hors de l'heure d'été).
RobG
6

Je suppose que je donnerai également une réponse:
Personnellement, j'aime essayer d'éviter la déclaration de variable gratuite, les appels de méthode et les appels de constructeur, car ils sont tous coûteux en performances. (dans des limites raisonnables, bien sûr)
J'allais laisser cela comme un simple commentaire sous la réponse donnée par @AnthonyWJones, mais j'y pensais mieux.

// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
    return this.setTime( 864E5 * days + this.valueOf() ) && this;
};

// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
    return date.setTime( 864E5 * days + date.valueOf() ) && date;
};

// Basic Function declaration...
function addDaysToDate( date, days ) {
    return date.setTime( 864E5 * days + date.valueOf() ) && date;
};

Ce qui précède respectera l'heure d'été. Cela signifie que si vous ajoutez un nombre de jours qui traversent l'heure d'été, l'heure affichée (heure) changera pour refléter cela.
Exemple:
le 2 novembre 2014, 02:00 était la fin de l'heure d'été.

var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt );                  // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) );    // Tue Nov 11 2014 09:30:00

Si vous cherchez à conserver l'heure sur l'heure d'été (10h30 sera donc toujours 10h30) ...

// Prototype usage...
Date.prototype.addDays = Date.prototype.addDays || function( days ) {
    return this.setDate( this.getDate() + days ) && this;
};

// Namespace usage...
namespace.addDaysToDate = function( date, days ) {
    return date.setDate( date.getDate() + days ) && date;
};

// Basic Function declaration...
function addDaysToDate( date, days ) {
    return date.setDate( date.getDate() + days ) && date;
};

Alors maintenant, vous avez ...

var dt = new Date( 2014, 10, 1, 10, 30, 0 );
console.log( dt );                  // Sat Nov 01 2014 10:30:00
console.log( dt.addDays( 10 ) );    // Tue Nov 11 2014 10:30:00
Duncan
la source
6

Non, javascript n'a pas de fonction intégrée, mais vous pouvez utiliser une simple ligne de code

timeObject.setDate(timeObject.getDate() + countOfDays);
Vahag Chakhoyan
la source
5

J'utilise quelque chose comme:

new Date(dateObject.getTime() + amountOfDays * 24 * 60 * 60 * 1000)

Fonctionne avec gain de temps:

new Date(new Date(2014, 2, 29, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)

Fonctionne avec la nouvelle année:

new Date(new Date(2014, 11, 31, 20, 0, 0).getTime() + 1 * 24 * 60 * 60 * 1000)

Il peut être paramétré:

function DateAdd(source, amount, step) {
  var factor = 1;
  if (step == "day") factor = 24 * 60 * 60 * 1000;
  else if (step == "hour") factor = 60 * 60 * 1000;
  ...
  new Date(source.getTime() + amount * factor);
}
kpull1
la source
4

J'utilise la solution suivante.

var msInDay = 86400000;
var daysToAdd = 5;
var now = new Date();
var milliseconds = now.getTime();
var newMillisecods = milliseconds + msInDay * daysToAdd;
var newDate = new Date(newMillisecods);
//or now.setTime(newMillisecods);

Date a un constructeur qui accepte un int. Cet argument représente le total des millisecondes avant / après le 1er janvier 1970. Il a également une méthode setTime qui fait de même sans créer un nouvel objet Date.

Ce que nous faisons ici est de convertir les jours en millisecondes et d'ajouter cette valeur à la valeur fournie par getTime. Enfin, nous donnons le résultat au constructeur Date (millisecondes) ou à la méthode setTime (millisecondes).

Vakhtang
la source
Tous les jours n'ont pas 24h, il échoue pour l'heure d'été et les secondes intercalaires.
Stephan
Stephan, une autre bibliothèque explique-t-elle cela?
Vakhtang
now.setDate(now.getDate() + days);gère automatiquement les modifications DST. Et je dois corriger, les secondes intercalaires sont ignorées dans les horodatages JS.
Stephan
4

Edit: Au lieu de setTime()(ou setHours()) vous pouvez le faire de cette façon:

Date.prototype.addDays= function(d){
  this.setDate(this.getDate() + d);
  return this;
};

var tomorrow = new Date().addDays(1);

Vieux:

Au lieu d'utiliser, setTime()vous pouvez utiliser setHours():

Date.prototype.addDays= function(d){
    this.setHours(this.getHours() + d * 24);
    return this;
};

var tomorrow = new Date().addDays(1);

Voir le JSFiddle ...

spaark
la source
suivant cette logique, vous pouvez également ajouter un jour;)d.setDate(d.getDate() + 1);
Rivenfall
4

Code très simple pour ajouter des jours en date dans le script java.

var d = new Date();
d.setDate(d.getDate() + prompt('how many days you want to add write here'));
alert(d);

Rana Aalamgeer
la source
4

Il existe une méthode setDate et une méthode getDate , qui vous permettent de faire quelque chose comme ceci:

var newDate = aDate.setDate(aDate.getDate() + numberOfDays);

Si vous souhaitez à la fois soustraire un nombre de jours et formater votre date dans un format lisible par l'homme, vous devriez envisager de créer un DateHelperobjet personnalisé qui ressemble à ceci:

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. Add 20 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), 20));

(voir aussi ce violon )

John Slegers
la source
4

L'extension du prototype en javascript peut ne pas être une bonne idée , en particulier dans les bases de code professionnelles.

Ce que vous voulez faire, c'est étendre la Dateclasse native :

class MyCustomDate extends Date {

  addDays(days) {
    const date = new MyCustomDate(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
  }
  
}

const today = new MyCustomDate();

const nextWeek = today.addDays(7)

console.log(nextWeek)

De cette façon, si un jour Javascript implémente une addDaysméthode native , vous ne casserez rien.

Creaforge
la source