Soustraire des jours d'une date en JavaScript

603

Quelqu'un connaît-il un moyen facile de prendre une date (par exemple aujourd'hui) et de remonter X jours en arrière?

Ainsi, par exemple, si je veux calculer la date 5 jours avant aujourd'hui.

jonhobbs
la source
4
J'ai rencontré des problèmes en utilisant la réponse acceptée. Apparemment, l'utilisation de valeurs négatives dans setDate () ne fonctionne pas comme prévu. Voir stackoverflow.com/a/9037132/792287 pour une autre (meilleure?) Solution.
vandiedakaf
5
Copie possible: stackoverflow.com/questions/1187824/…
Anderson Green
Vérifiez github.com/viebig/datetreta
Guilherme Viebig

Réponses:

962

Essayez quelque chose comme ceci:

 var d = new Date();
 d.setDate(d.getDate()-5);

Notez que cela modifie l'objet date et renvoie la valeur d'heure de la date mise à jour.

var d = new Date();

document.write('Today is: ' + d.toLocaleString());

d.setDate(d.getDate() - 5);

document.write('<br>5 days ago was: ' + d.toLocaleString());

Stephen Wrighton
la source
9
La sortie de cela me donne une longue chaîne d'entiers. Une idée de comment le formater en 14/05/2012?
user525146
162
Étant donné que c'est au sommet de Google, je pense que je répondrais au commentaire ci-dessus: new Date(new Date().setDate(new Date().getDate()-5))- ce sera il y a 5 jours. Dans l'exemple de la réponse, passez-le à une nouvelle date pour obtenir un objet date. C'est new Date(d)ce que tu veux.
Jesse
8
Le problème est que vous pouvez vous retrouver avec 00 qui n'est pas une valeur valide pour la date.
DominicM
24
setDate(-1)fixera la date au dernier jour du mois
Peter
5
@ user525146 a demandé comment formater le nombre, pas quel est le nombre. Pas besoin de réponses condescendantes. Pour formater le numéro, utilisez une des dates des toStringméthodes telles que toISOString, toDateString, etc.
Bad Request
83
var dateOffset = (24*60*60*1000) * 5; //5 days
var myDate = new Date();
myDate.setTime(myDate.getTime() - dateOffset);

Si vous effectuez de nombreuses manipulations de dates complexes dans votre application Web, DateJS vous facilitera la vie:

http://simonwillison.net/2007/Dec/3/datejs/

karim79
la source
23
c'est un cas de bord, mais cela peut échouer vers le début / la fin de l'heure d'été. vous ne soustrayez pas 5 jours, mais 5 * 24 heures. le premier jour de l'heure d'été ne dure que 23 heures et le dernier 25 heures. cela n'a généralement pas d'importance, mais c'est quelque chose à considérer.
Kip
11
@Kip Je déteste l'heure d'été ... et les fuseaux horaires. Nous devrions tous passer à GMT.
cwallenpoole
6
@cwallenpoole pour ne pas faire éclater votre bulle, mais ils utilisent l'heure d'été même à Greenwich. Donc, si vous voulez vraiment être sur GMT, vous êtes limité à l'Islande et à quelques pays d'Afrique de l'Ouest.
Kip
1
Le problème avec cette méthode, c'est qu'elle ne fonctionne pas avec la nouvelle année, etc.
Daniel Williams
4
@danielWilliams Comment cela ne fonctionne-t-il pas avec une nouvelle année? getTime()et setTime()sont millisecondes depuis l'époque. Peu importe que le temps traverse une limite annuelle.
Mashmagar
53

Ca fait plutot comme ca:

var d = new Date(); // today!
var x = 5; // go back 5 days!
d.setDate(d.getDate() - x);
Chris Nielsen
la source
La sortie de cela me donne une longue chaîne d'entiers. Une idée de comment le formater en 14/05/2012?
user525146
7
La valeur de retour de d.setDate est en effet une valeur entière. Cependant, vous n'êtes probablement pas réellement intéressé par la valeur de retour à ce stade, car la valeur réelle de "d" a été modifiée. Votre vraie question est maintenant de savoir comment formater votre date, qui est maintenant en "d" et non la valeur de retour de setDate du tout. (Eh bien, c'est en fait la valeur de retour, mais ce n'est pas une date à ce stade et je ne veux pas vous confondre - utilisez simplement d, ce sera plus rapide). Pour formater les dates, vous souhaitez les méthodes d.getMonth (), d.getFullYear () et d.getDate (). Vous voulez en ajouter un à d.getMonth (), car Jan est 0.
Chris Nielsen
2
Comme une méthode simple: function getDaysAgo(b){var a=new Date;a.setDate(a.getDate()-b);return a};alors justevar daysAgo45 = getDaysAgo(45);
SpYk3HH
@MiroKrsjak Bien sûr, cela fonctionne si vous traversez la fin / le début du mois. Pourquoi ça ne marcherait pas?
Chris Nielsen
23

J'ai remarqué que les getDays + X ne fonctionnent pas au-delà des frontières jour / mois. L'utilisation de getTime fonctionne tant que votre date n'est pas antérieure à 1970.

var todayDate = new Date(), weekDate = new Date();
weekDate.setTime(todayDate.getTime()-(7*24*3600000));
awjr
la source
3
J'ai remarqué la même chose. Je suis plus surpris que ça, ou ai-je raté quelque chose?
Sean Glover
11
Ceci est incorrect, la nouvelle date (). SetDate (-1) vous donnera le dernier jour du mois précédent.
zbrunson
2
Cela est également incorrect autour du cas de bord de début / fin de l'heure d'été. Votre approche soustrait 7 * 24 heures, en supposant que chaque jour a 24 heures. Le premier jour de l'heure d'été ne dure que 23 heures et le dernier jour dure 25 heures. setDate (getDate () - 7) n'a pas ce problème.
Kip
1
getTime fonctionne sur le temps universel. Donc, soustraire correctement 7 jours de temps de l'objet Date. Lorsque vous le convertissez en une chaîne dans votre fuseau horaire spécifié, il affichera correctement l'heure pour ce fuseau horaire.
2015
Soyez prudent le jour du changement d'heure. Lorsque nous retombons à l'automne, ce jour a 25 heures, donc en soustrayant 24 heures à partir de minuit, vous arriverez le même jour. Mais cette technique (soustrayant les millisecondes) fonctionnera si vous arrondissez le lendemain de chaque opération à minuit le plus proche. Vous pouvez le faire en ajoutant d'abord 12 heures, puis en réglant les heures à zéro.
Magmatic
18

obtenir moment.js. Tous les enfants cool l'utilisent. Il a plus d'options de formatage, etc. Où

var n = 5;
var dateMnsFive = moment(<your date>).subtract(n , 'day');

Optionnel! Convertir en obj JS Date pour reliure angulaire.

var date = new Date(dateMnsFive.toISOString());

Optionnel! Format

var date = dateMnsFive.format("YYYY-MM-DD");
Kentonbmax
la source
en passant votre date en un instant, vous commencerez à recevoir des avertissements. Avertissement de dépréciation: la valeur fournie n'est pas dans un format RFC2822 ou ISO reconnu. la construction du moment revient à js Date (), qui n'est pas fiable sur tous les navigateurs et versions. Les formats de date non RFC2822 / ISO sont déconseillés et seront supprimés dans une prochaine version majeure. Veuillez vous référer à momentjs.com/guides/#/warnings/js-date pour plus d'informations.
Changer
13

J'ai fait ce prototype pour Date afin que je puisse passer des valeurs négatives pour soustraire des jours et des valeurs positives pour ajouter des jours.

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

Donc, pour l'utiliser, je peux simplement écrire:

var date_subtract = new Date().adjustDate(-4),
    date_add = new Date().adjustDate(4);
Rob Dawley
la source
2
Vous pouvez utiliser d.setDate(d.getDate() + days)des valeurs positives et négatives pour les jours pour ajouter et soustraire des jours respectivement. Et cela devrait fonctionner sur l'instance (comme le font les autres méthodes Date), pas créer et renvoyer une copie.
RobG
13

Quelques-unes des solutions existantes étaient proches, mais pas exactement ce que je voulais. Cette fonction fonctionne avec des valeurs positives ou négatives et gère les cas limites.

function addDays(date, days) {
    return new Date(
        date.getFullYear(),
        date.getMonth(),
        date.getDate() + days,
        date.getHours(),
        date.getMinutes(),
        date.getSeconds(),
        date.getMilliseconds()
    );
}
Joel Fillmore
la source
2
cela déborde-t-il sur le mois suivant si j'utilise cette méthode pour ajouter 20 jours au 15 du mois en cours? Cela ne semble pas.
Bora
2
@Bora - oui, il incrémente correctement le mois si nécessaire. Par exemple, en ajoutant 20 jours au 15 août: addDays (nouvelle date (2015, 07, 15), 20) renverra "Ven 04 Sep 2015 00:00:00 GMT-0700 (PDT)"
Joel Fillmore
12

J'aime faire le calcul en millisecondes. Alors utilisezDate.now()

var newDate = Date.now() + -5*24*3600*1000; // date 5 days ago in milliseconds

et si vous l'aimez formaté

new Date(newDate).toString(); // or .toUTCString or .toISOString ...

REMARQUE: Date.now()ne fonctionne pas dans les anciens navigateurs (par exemple IE8 je pense). Polyfill ici .

MISE À JOUR juin 2015

@socketpair a souligné ma négligence. Comme il le dit, "un jour de l'année compte 23 heures et 25 en raison des règles de fuseau horaire".

Pour développer cela, la réponse ci-dessus aura des inexactitudes d'heure d'été dans le cas où vous souhaitez calculer le jour LOCAL il y a 5 jours dans un fuseau horaire avec des changements d'heure d'été et vous

  • supposons (à tort) que Date.now()l'heure locale actuelle est indiquée, ou
  • utilisation .toString()qui renvoie la date locale et est donc incompatible avec la Date.now()date de base en UTC.

Cependant, cela fonctionne si vous faites vos calculs en UTC, par exemple

A. Vous voulez la date UTC il y a 5 jours de MAINTENANT (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. Vous commencez avec une date de base UTC autre que "maintenant", en utilisant Date.UTC()

newDate = new Date(Date.UTC(2015, 3, 1)).getTime() + -5*24*3600000;
new Date(newDate).toUTCString(); // or .toISOString BUT NOT toString
chic
la source
3
Ce n'est pas précis. Certains jours de l'année ont 23 heures et 25 en raison des règles de fuseau horaire.
socketpair
Je m'inquiéterais des conditions d'échec quand il y a des secondes intercalaires ... donc peut-être pas bon pour le code critique.
robocat
12

Je trouve un problème avec la méthode getDate () / setDate (), car elle transforme trop facilement tout en millisecondes, et la syntaxe est parfois difficile à suivre pour moi.

Au lieu de cela, j'aime travailler sur le fait que 1 jour = 86 400 000 millisecondes.

Donc, pour votre question particulière:

today = new Date()
days = 86400000 //number of milliseconds in a day
fiveDaysAgo = new Date(today - (5*days))

Fonctionne comme un charme.

J'utilise cette méthode tout le temps pour faire des calculs glissants de 30/60/365 jours.

Vous pouvez facilement extrapoler cela pour créer des unités de temps pour des mois, des années, etc.

Jonathan Bechtel
la source
11

divisez votre date en parties, puis renvoyez une nouvelle date avec les valeurs ajustées

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

N'oubliez pas que les mois sont basés sur zéro, mais pas les jours. c'est-à-dire nouvelle date (2009, 1, 1) == 01 février 2009, nouvelle date (2009, 1, 0) == 31 janvier 2009;

Joshua
la source
2
Que se passe-t-il si vous ajoutez par exemple 50 jours à une date de cette façon? Fixera-t-il la date au 68 août 2009? Ou êtes-vous sûr que cela se termine toujours correctement au mois et / ou à l'année appropriés?
Jesper
Utilisé pour ajouter addDays, addMonths et addYears à Date.prototype. Agréable et simple.
Scott Isaacs
1
Cela devrait être la bonne réponse - cela fonctionne même le dernier jour de l'année lorsque la réponse acceptée échoue.
kris
Ne fonctionne pas pour les dates avec des années de 1 à 99. ;-) Beaucoup mieux d'utiliser simplement les méthodes get * et set * .
RobG
8

Sans utiliser la deuxième variable, vous pouvez remplacer 7 pour votre dos x jours:

let d=new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))
vaibhavmaster
la source
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);

Petr Makarov
la source
2

J'ai créé une fonction de manipulation de date. vous pouvez ajouter ou soustraire n'importe quel nombre de jours, heures, minutes.

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

Maintenant, appelez cette fonction en passant des paramètres. Par exemple, voici un appel de fonction pour obtenir la date avant 3 jours à compter d'aujourd'hui.

var today = new Date();
var newDate = dateManipulation(today, 3, 0, 0, "-");
Malvi Panchal
la source
2

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

UtkarshPramodGupta
la source
1

Les meilleures réponses ont conduit à un bug dans mon code où, le premier du mois, il fixait une date future dans le mois en cours. Voici ce que j'ai fait,

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
Kishore Avineni
la source
0

Un moyen simple de gérer les dates est d'utiliser Moment.js

Vous pouvez utiliser add. Exemple

var startdate = "20.03.2014";
var new_date = moment(startdate, "DD.MM.YYYY");
new_date.add(5, 'days'); //Add 5 days to start date
alert(new_date);

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

Juan Caicedo
la source
0

J'aime ce qui suit car c'est une seule ligne. Pas parfait avec les changements d'heure d'été mais généralement assez bon pour mes besoins.

var fiveDaysAgo = new Date(new Date() - (1000*60*60*24*5));
ScottE
la source
0

pour moi, toutes les combinaisons ont bien fonctionné avec l'extrait de code ci-dessous, l'extrait de code est pour la mise en œuvre Angular-2, si vous devez ajouter des jours, passer un nombre positif de jours, si vous devez soustraire passer un nombre négatif de jours

function addSubstractDays(date: Date, numberofDays: number): Date {
let d = new Date(date);
return new Date(
    d.getFullYear(),
    d.getMonth(),
    (d.getDate() + numberofDays)
);
}
pritesh agrawal
la source
0

J'ai un bon kilométrage obsolète.

http://www.datejs.com/

d = new Date();
d.add(-10).days();  // subtract 10 days

Agréable!

Le site Web comprend cette beauté:

Datejs ne se contente pas d'analyser les chaînes, il les tranche proprement en deux

Bret Weinraub
la source
0

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

(voir aussi ce violon )

John Slegers
la source
0

Voir le code suivant, soustrayez les jours de la date actuelle. Définissez également le mois en fonction de la date soustraite.

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);
Manoj Jha
la source
-1

Lors de la définition de la date, la date est convertie en millisecondes, vous devez donc la reconvertir en date:

Cette méthode prend également en compte le changement de nouvel an, 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) );
Daniel Williams
la source
-1

Vous pouvez utiliser 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

Pour PHP,

$date =  date('Y-m-d', strtotime("-5 days")); // it shows 5 days before today.
echo $date;

J'espère que cela vous aidera.

Phénix
la source
-1

J'ai converti en millisecondes et les jours déduits sinon le mois et l'année ne changeront pas et logique

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

L'espoir aide

hemanjosko
la source
-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 );

belal ahmad
la source
1
Vous devriez toujours commenter votre code / réponse car certaines personnes pourraient ne pas comprendre ce que vous faites
Michael
-1

Utilisation de la syntaxe de la fonction JavaScript moderne

const getDaysPastDate = (daysBefore, date = new Date) => new Date(date - (1000 * 60 * 60 * 24 * daysBefore));

console.log(getDaysPastDate(1)); // yesterday

vdegenne
la source
-1

Essayez quelque chose comme ça

dateLimit = (curDate, limit) => {
    offset  = curDate.getDate() + limit
    return new Date( curDate.setDate( offset) )
}

currDate peut être n'importe quelle date

la limite pourrait être la différence de nombre de jours (positive pour l'avenir et négative pour le passé)

wahid_abdul
la source
-1

Cela vous donnera un résultat des 10 derniers jours à 110% de travail, vous n'obtiendrez aucun type de problème

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;

vous pouvez modifier les jours de soustraction selon vos besoins

Zubair
la source
-2
var daysToSubtract = 3;
$.datepicker.formatDate('yy/mm/dd', new Date() - daysToSubtract) ;
sirWaltmore III
la source
-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());

gatlingovind
la source