2009-08-18 71 views
7

我正在尋找一種方法來做兩個javascript日期對象之間的適當減法並獲得日增量。javascript日期減法

這是我的做法,但它對於今天的日期無法作爲輸入:

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

什麼將是這更好的方法呢?

回答

7

在日期構造函數的月份數是零基礎的,你應該。減去一個,我認爲這是simplier使用時間戳來計算增量:

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

感謝您的修復,但這似乎失敗: getDayDelta(2009,8,19); //返回1,但返回0(在我的本地時間是18) – Hellnar 2009-08-18 18:05:12

+0

是的,那是因爲'today'包含時間,請參閱我的編輯... – CMS 2009-08-18 18:50:01

+0

@Crib:問題在於'incomingDate'的時間部分是0小時,0分鐘,0秒和0毫秒。你必須對「今天」做同樣的事情,否則你將會在一天之前/之後得到部分日子。我編輯了答案以反映這一變化。 – 2009-08-18 18:51:02

5

您可以在每個日期對象上調用getTime(),然後從較早的日期對象中減去該日期。這會給你兩個對象之間的毫秒數差。從那裏,很容易達到幾天。

幾個打嗝要注意,但:1)夏時制,2)確保您的時間來自同一時區。

6

(2009年8月18日)不是8月18日。現在是9月18日。

+3

這幾個月是一個從零開始的指數。 0是1月。 – Sampson 2009-08-18 17:46:18

+0

這是正確的,因爲日期函數零指數爲幾個月。 – MacAnthony 2009-08-18 17:46:20

+1

哦javascript,你好笑! – Rebs 2016-07-28 06:07:06

0

這將更好地工作,但它不沒有正確處理負面的結果值。你可能想簡單地解析這些值並處理它們。

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

格式不是函數http://is.gd/2n46k – CMS 2009-08-18 17:51:20

+0

那麼它爲什麼工作? (我的環境是ASP.NET。) – 2009-08-18 18:53:48

+1

是的,ASP .NET Ajax Framework擴展了客戶端的Date對象 – CMS 2009-08-18 19:07:28