2016-04-05 14 views
3

Ich versuche, einen Monat von 2015-12-31 zu subtrahieren, aber es gibt mir 2015-12-01 anstelle von 2015-11-30. Warum ?Subtrahieren 1 Monat bis 2015-12-31 gibt 2015-12-01

Code:

var date1 = new Date('2015-12-31'); 
var date2 = new Date(date1); 

date2.setMonth(date1.getMonth() - 1); 
console.log(date1); 
console.log(date2); 

Ausgang:

Thu Dec 31 2015 01:00:00 GMT+0100 (CET) 
Tue Dec 01 2015 01:00:00 GMT+0100 (CET) 

Jede Abhilfe?

+0

Nun, Sie versuchen technisch, den 31. November so zu verwenden, wie Sie es tun, was nicht existiert. – Devon

+0

Ich bekomme 'Mon 30. November 2015 19:00:00 GMT-0500 (Eastern Standard Time)' – j08691

+0

@ j08691, das ist UTC Dec 1 2015 00:00:00 – Devon

Antwort

1

Try this

var date1 = new Date('2015-12-31'); 
var date2 = new Date(date1); 
date2.setDate(date2.getDate()-date1.getDate()); 
alert(date2) 
+1

Vereinfacht es in 'date2.setDate (date2.getDate() - date2.getDate());' und es funktioniert. Vielen Dank! – Flawyte

+0

Das funktioniert nur für den letzten Tag des Monats, also ist nicht wirklich eine allgemeine Lösung. Es gibt andere Tage (wie den 30. März), die nicht der letzte Tag des Monats sind und das gleiche Problem haben, und der 29. März, der es zeitweise hat. – RobG

+0

@RobG Ja rechts, aber Voraussetzung ist für Enddaten in diesem Fall wird es funktionieren –

0

Per den setMonth documentation: ‚Wenn Sie nicht die [optional] dayValue Parameter geben, kehrte der Wert aus der getDate() Methode wird verwendet‘. Da Sie den optionalen Parameter nicht angeben, versucht Ihr Code, das Datum auf 2015-11-31 festzulegen, was nicht gültig ist. JavaScript behebt diese Situation, indem es das Datum auf einen Tag nach dem 2015-11-30, also dem 2015-12-01, setzt.

Wie für eine Problemumgehung, hängt es davon ab, was Sie eigentlich tun möchten. Versuchen Sie, 31 Tage ab dem 31. Dezember zurück zu gehen? Oder versuchst du den letzten Tag des Monats vor Dezember zu bekommen? Datums-Semantik ist extrem kompliziert; Was werden Sie tun, wenn die unvermeidlichen Fälle auftreten?

+0

Nun, wenn Sie einen Monat bis zum letzten Tag eines Monats subtrahieren, erwarten Sie, den letzten Tag des vorherigen Monats zu erhalten. Zumindest ist das meine Meinung, und das möchte ich erreichen. – Flawyte

+0

Bitte beachten Sie, dass MDN keine Autorität auf ECMAScript ist, die Sprachspezifikation ist, d. H. [* ECMA-262 *] (http://ecma-international.org/ecma-262/6.0/index.html). Der Algorithmus für * setMonth * ist in [* §20.3.4.25 *] (http://ecma-international.org/ecma-262/6.0/index.html#sec-date.prototype.setmonth) (was ziemlich gut ist) zusammengefasst auf MDN). – RobG

0

Erzeugt das angeforderte Ergebnis, das einen Monat vom angegebenen Datum subtrahiert. Aber denken Sie daran, dass ein Monat eine variable Zeitmenge ist. Der 31. November ist eigentlich der 1. Dezember (genauso wie der 55. November eigentlich der 25. Dezember Weihnachten wäre). Um den letzten Tag des Vormonats erhalten Sie so etwas tun könnte:

var date = new Date('2015-12-31'); 
date.setDate(-1) 
1

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.