web-dev-qa-db-fra.com

Comment calculer la date en JavaScript trois mois avant aujourd'hui?

J'essaie de former une date qui est 3 mois avant la date actuelle. Je reçois le mois en cours par le code ci-dessous

var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;

Pouvez-vous me donner la logique pour calculer et former une date (un objet du type de données Date) en considérant que lorsque le mois est janvier (1), 3 mois avant la date correspondrait à OCtober (10)?

127
KeenUser
var d = new Date();
d.setMonth(d.getMonth() - 3);

Cela fonctionne pour janvier. Exécutez cet extrait:

var d = new Date("2012/01/14");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());
272
gilly3

Je recommande d'utiliser une bibliothèque appelée Moment.js.

Il est bien testé, fonctionne à la fois sur le navigateur et côté serveur (je l’utilise à la fois dans les projets Angular et Node). Il a un grand soutien pour les dates locales.

http://momentjs.com/

var threeMonthsAgo = moment().subtract(3, 'months');

console.log(threeMonthsAgo.format()); // 2015-10-13T09:37:35+02:00

.format() retourne une représentation sous forme de chaîne de la date au format ISO 8601 . Vous pouvez également l'utiliser avec un format de date personnalisé comme ceci: .format('dddd, MMMM Do YYYY, h:mm:ss a')

21
Jan Osch

Cela devrait gérer addition/soustraction, il suffit de mettre une valeur négative pour soustraire et une valeur positive pour ajouter. Cela résout également le problème de croisement mensuel.

function monthAdd(date, month) {
    var temp = date;
    temp = new Date(date.getFullYear(), date.getMonth(), 1);
    temp.setMonth(temp.getMonth() + (month + 1));
    temp.setDate(temp.getDate() - 1); 

    if (date.getDate() < temp.getDate()) { 
        temp.setDate(date.getDate()); 
    }

    return temp;    
}
7
Hodeifa Baswel

Pour simplifier les choses, vous pouvez utiliser DateJS, une bibliothèque de dates pour JavaScript:

http://www.datejs.com/

Exemple de code pour vous:

Date.today().add({ months: -1 });
7
thinkdevcode

Un "une ligne" (sur plusieurs lignes pour une lecture facile)) à mettre directement dans une variable:

var oneMonthAgo = new Date(
    new Date().getFullYear(),
    new Date().getMonth() - 1, 
    new Date().getDate()
);
5
user7394313

J'aime la simplicité de réponse de gilly , mais les utilisateurs seront probablement surpris qu'un mois avant le 31 mars soit le 3 mars. J'ai choisi d'implémenter une version qui colle à la fin du mois, donc un mois avant. Les 28, 29, 30 et 31 mars seront tous le 28 février quand ce ne sera pas une année bissextile.

function addMonths(date, months) {
  var result = new Date(date),
      expectedMonth = ((date.getMonth() + months) % 12 + 12) % 12;
  result.setMonth(result.getMonth() + months);
  if (result.getMonth() !== expectedMonth) {
    result.setDate(0);
  }
  return result;
}

var dt2004_05_31 = new Date("2004-05-31 0:00"),
    dt2001_05_31 = new Date("2001-05-31 0:00"),
    dt2001_03_31 = new Date("2001-03-31 0:00"),
    dt2001_02_28 = new Date("2001-02-28 0:00"),
    result = addMonths(dt2001_05_31, -2);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, -3);
console.assert(dt2001_02_28.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, 36);
console.assert(dt2004_05_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2004_05_31, -38);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

console.log('Done.');
3
Don Kirkby

Si la méthode setMonth proposée par gilly3 n’est pas celle que vous recherchez, envisagez:

var someDate = new Date(); // add arguments as needed
someDate.setTime(someDate.getTime() - 3*28*24*60*60);
// assumes the definition of "one month" to be "four weeks".

Peut être utilisé pour n'importe quelle durée, il suffit de définir les bons multiples.

3

Il y a déjà une réponse élégante mais je trouve que c'est difficile à lire alors j'ai créé ma propre fonction. Pour mes besoins, je n'ai pas eu besoin d'un résultat négatif, mais ce ne serait pas difficile à modifier.

    var subtractMonths = function (date1,date2) {
        if (date1-date2 <=0) {
            return 0;
        }
        var monthCount = 0;
        while (date1 > date2){
            monthCount++;
            date1.setMonth(date1.getMonth() -1);
        }
        return monthCount;
    }
1
JamesD
var d = new Date("2013/01/01");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() + 18);
console.log(d.toLocaleDateString());
1
pooja
   var minDate = new Date(); 
   minDate.setMonth(minDate.getMonth() - 3);

Déclarer une variable qui a la date actuelle. ensuite, en utilisant la fonction intégrée setMonth, nous pouvons obtenir une date de retour de 3 mois.

0
rohit gaidhane