Wenn Monaten subtrahieren, können Sie prüfen, ob der Tag des eingestellten Datum unterscheidet sich von der Tag des Anfangsdatums. Wenn dies der Fall ist, muss es auf den nächsten Monat übergegangen sein, also setze den Tag des angepassten Datums auf 0, so dass es zum letzten Tag des vorherigen Monats geht, z.
function subtractMonths(date, months) {
var day = date.getDate();
date.setMonth(date.getMonth() - months);
if (date.getDate() != day) date.setDate(0);
return date;
}
// 31 Mar 2016 - 1 month = 29 Feb 2015
[[new Date(2016,2,31), 1],
// 29 Feb 2016 - 12 months = 28 Feb 2015
[new Date(2016,1,29), 12],
// 15 Feb 2016 - 3 months = 15 Nov 2015
[new Date(2016,1,15), 3]].forEach(function(arr){
document.write('<br>' + subtractMonths(arr[0], arr[1]));
})
Der gleiche Algorithmus kann für das Hinzufügen von Monaten verwendet werden. Beachten Sie, dass die Datumsarithmetik deshalb nicht symmetrisch ist, z.
31 May + 1 month => 30 June
30 June - 1 month => 30 May
das heißt, wenn A + B = C, dann C - B = A (und umgekehrt) kann oder kann nicht der Fall sein.
Nun, Sie versuchen technisch, den 31. November so zu verwenden, wie Sie es tun, was nicht existiert. – Devon
Ich bekomme 'Mon 30. November 2015 19:00:00 GMT-0500 (Eastern Standard Time)' – j08691
@ j08691, das ist UTC Dec 1 2015 00:00:00 – Devon