Wie berechne ich das Datum in JavaScript drei Monate vor dem heutigen Tag?

147

Ich versuche, ein Datum zu bilden, das 3 Monate vor dem aktuellen Datum liegt. Ich erhalte den aktuellen Monat anhand des folgenden Codes

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

Könnt ihr mir die Logik geben, ein Datum (ein Objekt vom DateDatentyp) zu berechnen und zu bilden , wenn man bedenkt, dass wenn der Monat Januar (1) ist, 3 Monate vor dem Datum der Oktober (10) ist?

KeenUser
quelle

Antworten:

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

Dies funktioniert für Januar. Führen Sie dieses Snippet aus:

var d = new Date("January 14, 2012");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());


Es gibt einige Einschränkungen ...

Ein Monat ist eine merkwürdige Sache. Wie definieren Sie 1 Monat? 30 Tage? Die meisten Leute werden sagen, dass vor einem Monat derselbe Tag des Monats bedeutet, an dem das Zitat des Vormonats benötigt wird . Aber mehr als die Hälfte der Zeit, also vor 31 Tagen, nicht vor 30. Und wenn heute der 31. des Monats ist (und es nicht August oder Dezember ist), existiert dieser Tag des Monats im Vormonat nicht.

Interessanterweise stimmt Google JavaScript zu, wenn Sie fragen, welcher Tag einen Monat vor einem anderen Tag liegt :

Das Google-Suchergebnis für "einen Monat vor dem 31. März" zeigt "3. März".

Es heißt auch, dass ein Monat 30.4167 Tage lang ist : Das Google-Suchergebnis für "Ein Monat in Tagen" zeigt "30.4167".

Ist also ein Monat vor dem 31. März der gleiche Tag wie ein Monat vor dem 28. März, 3 Tage früher? Dies hängt alles davon ab, was Sie unter "einen Monat vorher" verstehen. Sprechen Sie mit Ihrem Produktbesitzer.

Wenn Sie wie momentjs vorgehen und diese Fehler am letzten Tag des Monats korrigieren möchten, indem Sie zum letzten Tag des Monats wechseln, können Sie Folgendes tun:

const d = new Date("March 31, 2019");
console.log(d.toLocaleDateString());
const month = d.getMonth();
d.setMonth(d.getMonth() - 1);
while (d.getMonth() === month) {
    d.setDate(d.getDate() - 1);
}
console.log(d.toLocaleDateString());

Wenn Ihre Anforderungen komplizierter sind, verwenden Sie etwas Mathematik und schreiben Sie Code. Du bist ein Entwickler! Sie müssen keine Bibliothek installieren! Sie müssen nicht aus dem Stackoverflow kopieren und einfügen! Sie können den Code selbst entwickeln, um genau das zu tun, was Sie brauchen!

gilly3
quelle
var currentDate = new Date (); var currentMonth = currentDate.getMonth () -12; var pastDate = new Date (2011, currentMonth, 01); alert (pastDate); Dies funktionierte, überprüft mit 12 Monaten
KeenUser
Dies ist eine kranke Antwort ... Woher bekomme ich 2012,0,15? Bestehenden Monat konvertieren -1?
Alex G
3
@AlexG - Wenn Sie mit dem Parsen von JavaScript-Daten noch nicht vertraut sind, kann ich sehen, wie verwirrend mein schnelles Beispiel wäre. JavaScript drückt Monate als nullbasiert aus, wobei Januar null ist. Um solche Verwirrung zu vermeiden, zumal dies nichts mit der Frage oder meiner Antwort zu tun hat, habe ich meine Demo aktualisiert, um das Datum aus einer Zeichenfolge zu erhalten, die intuitiver sein sollte.
gilly3
7
Ich weiß, dass dies alt ist, aber wenn das Datum der 31. März ist und Sie mit dieser Methode einen Monat abziehen, ist das Ergebnis der 2. März. jsfiddle.net/atamata/rvumf7dg
atamata
@atamata - Ja, das ist komisch, aber vorhersehbar und erwartet. 31 Tage nach dem Ende des Vormonats für März ist der 31. März, für Februar der 2. März. Wenn Sie ab Monatsende zählen möchten, müssen Sie dafür einen benutzerdefinierten Code schreiben.
gilly3
28

Ich empfehle die Verwendung einer Bibliothek namens Moment.js.

Es ist gut getestet, funktioniert browserübergreifend und serverseitig (ich verwende es sowohl in Angular- als auch in Node-Projekten). Es hat große Unterstützung für Gebietsschemadaten.

http://momentjs.com/

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

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

.format()Gibt eine Zeichenfolgendarstellung des im ISO 8601- Format formatierten Datums zurück . Sie können es auch mit einem benutzerdefinierten Datumsformat wie dem folgenden verwenden:.format('dddd, MMMM Do YYYY, h:mm:ss a')

Jan Osch
quelle
10

Ein "Einzeiler" (in vielen Zeilen zum einfachen Lesen)), der direkt in eine Variable eingefügt werden soll:

var oneMonthAgo = new Date(
    new Date().getFullYear(),
    new Date().getMonth() - 1, 
    new Date().getDate()
);
user7394313
quelle
nett! Ich bin mir nicht sicher, ob es für jedes Szenario gilt, scheint aber gut genug zu funktionieren.
Devin Fields
8

Um die Sache wirklich einfach zu machen, können Sie DateJS verwenden, eine Datumsbibliothek für JavaScript:

http://www.datejs.com/

Beispielcode für Sie:

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

Dies sollte die Addition / Subtraktion behandeln, nur einen negativen Wert zum Subtrahieren und einen positiven Wert zum Addieren eingeben. Dies löst auch das monatliche Crossover-Problem.

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;    
}
Hodeifa Baswel
quelle
6

Wenn die setMonthvon gilly3 angebotene Methode nicht Ihren Anforderungen entspricht, sollten Sie Folgendes berücksichtigen:

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".

Kann für eine beliebige Zeitdauer verwendet werden, stellen Sie einfach die richtigen Vielfachen ein.

Niet the Dark Absol
quelle
Ich würde mit gilly3s Antwort gehen. Ihre geht von einer festen Anzahl von Sekunden pro Monat aus. Die milde Datumsarithmetik von JavaScript hält den Tag korrekt. Drei Monate vor dem 28. September sollte der 28. Juli sein.
Ray Toal
1
Ich frage mich, was JavaScript am 31. März minus 1 Monat berechnen würde.
Niet the Dark Absol
1
In diesem Fall erhalten Sie den 3. März (für 2011), da sich der 31. Februar im milden Modus befindet. Wenn Sie jedoch 2 Monate abziehen, erhalten Sie den 31. Januar. Unter dem Modell mit 28 Tagen pro Monat würden Sie dies nicht tun. So schwach die DateKlasse ist und so sehr Date.js bevorzugt wird, modelliert sie zumindest einen milden proleptischen Kalender, der für den gelegentlichen Gebrauch gut genug ist.
Ray Toal
Sollten Sie nicht mehrere Sekunden bis 1000 richtig einstellen setTime()?
Vlad Tsepelev
4

Ich mag die Einfachheit der Antwort von gilly3 , aber Benutzer werden wahrscheinlich überrascht sein, dass ein Monat vor dem 31. März der 3. März ist. Ich habe mich dafür entschieden, eine Version zu implementieren, die am Ende des Monats bleibt, also einen Monat vor dem 28., 29., 30. März. und 31 werden alle der 28. Februar sein, wenn es kein Schaltjahr ist.

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

Don Kirkby
quelle
2

Es gibt bereits eine elegante Antwort, aber ich finde, dass es schwer zu lesen ist, also habe ich meine eigene Funktion gemacht. Für meine Zwecke brauchte ich kein negatives Ergebnis, aber es wäre nicht schwer zu ändern.

    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;
    }
JamesD
quelle
2

var d = new Date("2013/01/01");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() + 18);
console.log(d.toLocaleDateString());

pooja
quelle
1

Dies ist der kleinste und einfachste Code.

   var minDate = new Date(); 
   minDate.setMonth(minDate.getMonth() - 3);

Deklarieren Sie die Variable mit dem aktuellen Datum. dann können wir nur mit der eingebauten Funktion setMonth ein 3-Monats-Backdatum erhalten.

Rohit Gaidhane
quelle
-1

In meinem Fall musste ich 1 Monat bis zum aktuellen Datum abziehen. Der wichtige Teil war die Monatszahl, daher ist es egal, an welchem ​​Tag des aktuellen Monats Sie sich befinden, ich brauchte letzten Monat. Das ist mein Code:

var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)

dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month

//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)

1 Monat bis zum tatsächlichen Datum abziehen ist nicht korrekt. Deshalb setze ich an erster Stelle den ersten Tag des Monats (der erste Tag eines Monats ist immer der erste Tag) und an zweiter Stelle 1 Tag, der Sie immer an den letzten Monat sendet. Ich hoffe, dir zu helfen, Alter.

var dateObj = new Date('2017-03-30 00:00:00'); //Create new date object
console.log(dateObj); // Thu Mar 30 2017 00:00:00 GMT-0300 (ART)

dateObj.setDate(1); //Set first day of the month from current date
dateObj.setDate(-1); // Substract 1 day to the first day of the month

//Now, you are in the last month
console.log(dateObj); // Mon Feb 27 2017 00:00:00 GMT-0300 (ART)

Miguel Angel
quelle
-1

   

 var date=document.getElementById("date");
    var d = new Date();
   document.write(d + "<br/>");
    d.setMonth(d.getMonth() - 6);
    document.write(d);

 if(d<date)
  document.write("lesser then 6 months");
else
  document.write("greater then 6 months");

Santhosh
quelle
-1

Übergeben Sie ein JS-Datumsobjekt und eine Ganzzahl, wie viele Monate Sie addieren / subtrahieren möchten. monthsToAddkann positiv oder negativ sein. Gibt ein JS-Datumsobjekt zurück.

Wenn Sie der originalDateObject31. März sind und -1 als übergeben monthsToAdd, ist Ihr Ausgabedatum der 28. Februar.

Wenn Sie eine große Anzahl von Monaten, z. B. 36, vergehen, wird auch die Jahresanpassung ordnungsgemäß durchgeführt.

const addMonthsToDate = (originalDateObject, monthsToAdd) => {
  const originalDay = originalDateObject.getUTCDate();
  const originalMonth = originalDateObject.getUTCMonth();
  const originalYear = originalDateObject.getUTCFullYear();

  const monthDayCountMap = {
    "0": 31,
    "1": 28,
    "2": 31,
    "3": 30,
    "4": 31,
    "5": 30,
    "6": 31,
    "7": 31,
    "8": 30,
    "9": 31,
    "10": 30,
    "11": 31
  };

  let newMonth;
  if (newMonth > -1) {
    newMonth = (((originalMonth + monthsToAdd) % 12)).toString();
  } else {
    const delta = (monthsToAdd * -1) % 12;
    newMonth = originalMonth - delta < 0 ? (12+originalMonth) - delta : originalMonth - delta;
  }

  let newDay;

  if (originalDay > monthDayCountMap[newMonth]) {
    newDay = monthDayCountMap[newMonth].toString();
  } else {
    newDay = originalDay.toString();
  }

  newMonth = (+newMonth + 1).toString();

  if (newMonth.length === 1) {
    newMonth = '0' + newMonth;
  }

  if (newDay.length === 1) {
    newDay = '0' + newDay;
  }

  if (monthsToAdd <= 0) {
    monthsToAdd -= 11;
  }

  let newYear = (~~((originalMonth + monthsToAdd) / 12)) + originalYear;

  let newTime = originalDateObject.toISOString().slice(10, 24);

  const newDateISOString = `${newYear}-${newMonth}-${newDay}${newTime}`;

  return new Date(newDateISOString);
};
Adam
quelle
-5
Following code give me Just Previous Month From Current Month even the date is 31/30 of current date and last month is 30/29/28 days:

   <!DOCTYPE html>
<html>
<body>

<p>Click the button to display the date after changing the month.</p>

<button onclick="myFunction()">Try it</button>

<p id="demo"></p>

<script>
function myFunction() {

var d = new Date("March 29, 2017"); // Please Try the result also for "March 31, 2017" Or "March 30, 2017"
var OneMonthBefore =new Date(d);

OneMonthBefore.setMonth(d.getMonth(),0);
if(OneMonthBefore.getDate() < d.getDate()  )
{
d.setMonth(d.getMonth(),0);
}else
{
d.setMonth(d.getMonth()-1);

}

    document.getElementById("demo").innerHTML = d;
}
</script>

</body>
</html>
Mohammad Rahman
quelle
Wie unterscheidet sich diese Antwort von den 7 anderen, ziemlich alten Antworten, die bereits vorhanden sind?
Stephen Rauch
-5

var d = new Date();
document.write(d + "<br/>");
d.setMonth(d.getMonth() - 6);
document.write(d);

Santhosh
quelle