2009-08-18 21 views
7

İki javascript Date nesnesi arasında uygun çıkarma işlemini yapmanın ve gün deltasını alma yolunu arıyorum.javascript date çıkarma

Bu benim yaklaşımdır ancak bir giriş olarak bugünün tarih için başarısız:

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

Bunun için daha iyi bir yaklaşım olurdu?

cevap

7

Tarih yapıcı işlevindeki ay numarası sıfır birini substract gerektiğini, esaslı ve bunu zaman damgası kullanılarak delta basit hesaplanmakta olduğunu düşünüyorum edilir:

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

düzeltme için teşekkürler ama bu başarısız gibi görünüyor: getDayDelta (2009,8,19); // 1 döndürmeli ama 0 döndürür (bu benim yerel sürüme göre 18'dir) – Hellnar

+0

Evet, çünkü bugün 'zaman' zamanı içerir, benim düzenlememe bakın ... – CMS

+0

@Crib: Sorun, 'incomingDate'in bir zaman dilimine sahip olmasıdır 0 saat, 0 dakika, 0 saniye ve 0 milisaniye. Aynı şeyi 'bugün' yapmalısınız ya da bir gün öncesinde/arkasında kısmi günler alacaksınız. Değişikliği yansıtacak cevabı düzenledim. –

5

Her tarih nesnesine getTime() yöntemini çağırabilir ve daha sonra daha önce çıkartabilirsiniz. Bu, iki nesne arasındaki milisaniye sayısı farkını verir. Oradan günlere ulaşmak kolay.

İzlenecek birkaç hıçkırık, ancak: 1) yaz saati uygulaması ve 2) zamanlarınızın aynı saat diliminden gelmesini sağlama.

6

(2009,8,18), 18 Ağustos'ta DEĞİLDİR. 18 Eylül.

+3

Aylar sıfır temelli bir dizindir. 0 Ocak. – Sampson

+0

Bu, tarih işlevi sıfır indeksleri ay olarak doğrudur. – MacAnthony

+1

oh javascript, çok komiksin! – Rebs

0

Bu daha iyi çalışır, ancak o değil Negatif sonuç değerleriyle düzgün bir şekilde ilgilenmez. Değerleri kendiniz ayrıştırmak ve onlarla uğraşmak isteyebilirsiniz.

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

biçimi bir işlev değil http://is.gd/2n46k – CMS

+0

O zaman neden çalışıyor? (Ortamım ASP.NET'tür.) –

+1

Evet, ASP .NET Ajax Framework istemci tarafı Tarih nesnesini genişletir – CMS