2009-08-18 9 views
7

Ich bin auf der Suche nach einer Möglichkeit, die richtige Subtraktion zwischen zwei Javascript-Date-Objekte zu tun und den Tag Delta zu bekommen.Javascript Datum Subtraktion

Das ist mein Ansatz aber es funktioniert nicht für heutige Datum als Eingabe:

<script type="text/javascript"> 
function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
var incomingDate = new Date(incomingYear,incomingMonth,incomingDay); 
var today = new Date(); 

var delta = incomingDate - today; 
var resultDate = new Date(delta); 
return resultDate.getDate(); 
} 
//works for the future dates: 
alert(getDayDelta(2009,9,10)); 
alert(getDayDelta(2009,8,19)); 

//fails for the today as input, as expected 0 delta,instead gives 31: 
alert(getDayDelta(2009,8,18)); 
</script> 

Was würde dies eine bessere Lösung sein?

Antwort

7

Die Monatszahl in der Funktion Date-Konstruktor wird Null basiert, können Sie eine subtrahieren sollten, und ich denke, dass simplier ist das Delta mit dem Zeitstempel zu berechnen:

function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
    var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay), 
     today = new Date(), delta; 
    // EDIT: Set time portion of date to 0:00:00.000 
    // to match time portion of 'incomingDate' 
    today.setHours(0); 
    today.setMinutes(0); 
    today.setSeconds(0); 
    today.setMilliseconds(0); 

    // Remove the time offset of the current date 
    today.setHours(0); 
    today.setMinutes(0); 

    delta = incomingDate - today; 

    return Math.round(delta/1000/60/60/ 24); 
} 


getDayDelta(2008,8,18); // -365 
getDayDelta(2009,8,18); // 0 
getDayDelta(2009,9,18); // 31 
+0

danke für das Update, aber das scheint zu scheitern bei: getDayDelta (2009,8,19); // sollte 1 zurückgeben, gibt aber 0 zurück (es ist 18. bei meiner lokalen Zeit) – Hellnar

+0

Ja, das liegt daran, dass 'today' die Zeit enthält, siehe meine Bearbeitung ... – CMS

+0

@Crib: Das Problem ist, dass 'incomingDate' einen Zeitanteil von 0 Stunden, 0 Minuten, 0 Sekunden und 0 Millisekunden. Sie müssen das Gleiche mit "heute" machen, oder Sie werden partielle Tage für einen Tag im Voraus/zurück bekommen. Ich habe die Antwort bearbeitet, um die Änderung widerzuspiegeln. –

5

Sie könnten getTime() für jedes Datumsobjekt aufrufen und dann das spätere von dem früheren subtrahieren. Dies würde Ihnen die Anzahl von Millisekunden Unterschied zwischen den zwei Objekten geben. Von dort aus ist es leicht, an Tage zu kommen.

Ein paar Schluckauf zu beachten, obwohl: 1) Sommerzeit und 2) sicherzustellen, dass Ihre Zeiten kommen aus der gleichen Zeitzone.

6

(2009,8,18) ist NICHT 18. August. Es ist der 18. September.

+3

Die Monate sind ein Null-basierten Index. 0 ist Januar. – Sampson

+0

Dies ist korrekt, da die Datumsfunktion null Monate indiziert. – MacAnthony

+1

oh javascript, du bist so lustig! – Rebs

0

Dies funktioniert besser, aber es doesn Behandeln Sie keine negativen Ergebniswerte. Vielleicht möchten Sie einfach die Werte selbst analysieren und damit umgehen.

function getDayDelta(incomingYear,incomingMonth,incomingDay){ 
var incomingDate = new Date(incomingYear,incomingMonth-1,incomingDay); 
var today = new Date(); 
today = new Date(Date.parse(today.format("yyyy/MM/dd"))); 

var delta = incomingDate - today; 
if (delta == 0) { return 0; } 
var resultDate = new Date(delta); 
return resultDate.getDate(); 
} 
//works for the future dates: 
alert(getDayDelta(2009,9,10)); 
alert(getDayDelta(2009,8,19)); 
alert(getDayDelta(2009, 8, 18)); 
+0

Format ist keine Funktion http://is.gd/2n46k – CMS

+0

Warum funktioniert es dann? (Meine Umgebung ist ASP.NET.) –

+1

Ja, das ASP .NET Ajax Framework erweitert das clientseitige Date-Objekt – CMS