web-dev-qa-db-fra.com

Soustraire des jours à une date en JavaScript

Est-ce que quelqu'un connaît un moyen facile de prendre une date (par exemple, aujourd'hui) et de revenir en arrière X jours?

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

457
jonhobbs

Essayez quelque chose comme ça:

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

Notez que cela modifie l'objet de 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());

716
Stephen Wrighton
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 date dans votre application Web, DateJS vous simplifiera la vie:

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

59
karim79

Ca fait plutot comme ca:

var d = new Date(); // today!
var x = 5; // go back 5 days!
d.setDate(d.getDate() - x);
46
Chris Nielsen

J'ai remarqué que les getDays + X ne fonctionnent pas au-delà des limites jour/mois. Utiliser 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));
20
awjr

obtenir moment.js. Tous les enfants cools 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 JS Date obj pour la liaison angulaire.

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

Optionnel! Format

var date = dateMnsFive.format("YYYY-MM-DD");
13
Kentonbmax

J'ai créé ce prototype pour Date afin de pouvoir 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);
12
Rob Dawley

J'aime faire le calcul en millisecondes. Alors utilisez Date.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é mon manque à gagner. Comme il le dit, "Chaque jour de l'année, vous disposez de 23 heures et de 25 heures à cause des règles de fuseau horaire".

Pour répondre à cette question, la réponse ci-dessus comportera des inexactitudes en matière d'économie de jour si vous souhaitez calculer le jour LOCAL il y a 5 jours dans un fuseau horaire avec les modifications de l'éclairage diurne 

  • supposez (à tort) que Date.now() vous donne l'heure locale actuelle, ou 
  • utilisez .toString() qui renvoie la date locale et est donc incompatible avec la date de base Date.now() au format UTC. 

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

A. Vous voulez la date UTC il y a 5 jours à partir de NOW (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
10
poshest

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

Rappelez-vous que les mois sont à base zéro, mais les jours ne le sont pas. c'est-à-dire nouvelle date (2009, 1, 1) == 01 février 2009, nouvelle date (2009, 1, 0) == 31 janvier 2009;

9
Joshua

Quelques 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()
    );
}
9
Joel Fillmore

La méthode getDate ()/setDate () me pose un problème: elle transforme trop facilement tout en millisecondes et la syntaxe est parfois difficile à suivre pour moi.

Au lieu de cela, j'aime bien travailler sur le fait qu'un 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 roulants sur 30/60/365 jours.

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

6
Jonathan Bechtel

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

3
Petr Makarov

Sans utiliser la seconde variable, vous pouvez remplacer 7 par votre dos x jours:

let d=new Date(new Date().getTime() - (7 * 24 * 60 * 60 * 1000))
2
vaibhavmaster

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>

2
UtkarshPramodGupta

pour moi, toutes les combinaisons ont bien fonctionné avec l'extrait de code ci-dessous, l'extrait est destiné à la mise en œuvre Angular-2, si vous devez ajouter des jours, transmettez un nombre positif de jours, si vous devez soustraire, transmettez 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)
);
}
1
pritesh agrawal

J'ai créé une fonction pour la manipulation de la date. vous pouvez ajouter ou soustraire un nombre quelconque de jours, heures et 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;
 }

Appelez maintenant cette fonction en passant des paramètres. Par exemple, voici un appel de fonction pour obtenir une date avant 3 jours à compter de ce jour.

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

Un moyen facile 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/

1
Juan Caicedo

Les réponses les plus fréquentes ont entraîné un bogue dans mon code qui, le premier du mois, définissait une date ultérieure pour 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
1
Kishore Avineni

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

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 objet DateHelper personnalisé ressemblant à 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 this Fiddle )

1
John Slegers

Je reçois un bon kilométrage hors de date.js:

http://www.datejs.com/

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

Agréable!

Le site comprend cette beauté:

Datejs ne se contente pas d’analyser les chaînes, il les découpe proprement en deux

1
Bret Weinraub

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.

0
Phoenix

Voyez comment vous pouvez trouver la date de 5 jours avant aujourd'hui en utilisant les momentsjs.

moment(Date.now() - 5 * 24 * 3600 * 1000).format('YYYY-MM-DD') // 2019-01-03
0
Alex P

Essayez quelque chose comme ça

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

currDate pourrait être n'importe quelle date

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

0
wahid_abdul

J'aime ce qui suit parce que c'est une ligne. Pas parfait avec les changements DST mais généralement assez bon pour mes besoins.

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

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

0
belal ahmad

Lorsque vous définissez la date, celle-ci est convertie en millisecondes. Vous devez donc la reconvertir en date:

Cette méthode prend également en compte, changement de nouvelle année, 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) );
0
Daniel Williams

Utilisation de la syntaxe de fonction JavaScript moderne

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

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

0
vdegenne

var d = new Date();

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

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

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

0
gatlingovind

Je jouais et j'ai trouvé une solution simple:

Utilisez .setDate(+daysCount|-daysCount); le symbole =|- est un must;

let today = new Date();
today.setDate(-100);
console.log('date100DaysAgo', today);

today = new Date();
today.setDate(+100);
console.log('date100DaysAhead', today);
0
Black Mamba

J'ai converti en millisecondes et 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

0
hemanjosko
var today = new Date();
var tmpDate = new Date();
var i = -3; var dateArray = [];
while( i < 4 ){
    tmpDate = tmpDate.setDate(today.getDate() + i);
  tmpDate = new Date( tmpDate );
  var dateString = ( '0' + ( tmpDate.getMonth() + 1 ) ).slice(-2) + '-' + ( '0' + tmpDate.getDate()).slice(-2) + '-' + tmpDate.getFullYear();
    dateArray.Push( dateString );
    i++;
}
console.log( dateArray );
0
zion

Cela vous donnera le résultat des 10 derniers jours à 110%, vous ne recevrez aucun 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 changer les jours de soustraction en fonction de vos besoins

0
Zubair