奇怪的Js時間計算方法,跨多個月後出現1天的誤差

Zery發表於2013-08-06

在專案中要求用計算兩個時間相差的天數,通俗的說就是兩個時間 相減,

我的方法 先把兩個時間轉成相應的毫秒,相減後,再除以(1000 * 60 * 60 * 24) 就可以得到對應天數,但天數會比實際少一天所以需要再加上一天

程式碼如下

 function DateDiff() {
                  //startTime和endTime是18/12/2002格式   
                 var startTime = $("#<%=txtDepartureDate.ClientID %>").val();
                 var endTime = $("#<%=txtReturnDate.ClientID %>").val();
  
                 var newDate, sDate, eDate, iDays
  
                 newDate = startTime.split("/")
                 sDate = new Date(aDate[2], aDate[1]-1, aDate[0])
 
                 newDate = endTime.split("/")
                 eDate = new Date(aDate[2], aDate[1]-1, aDate[0])
                 iDays = Math.floor((eDate2 - sDate) / 86400000)
                 alert(iDays+1);
 }

       當時測試沒有跨好幾個月,發現都沒有問題,直到測試人員提了BUG然後自己仔細測終於發現了

BUG:開始日期為:06/08/2013     結束日期為:30/11/2013  計算的結果為116 

 然後將結束日期改為:01/12/2013 計算的結果居然為118,無緣無故的多出來了1天 

然後償試換種寫法方法式都是把時間轉成毫秒後相減再除(1000 * 60 * 60 * 24) 結果都多了一天,

 最後檢視了JS 文件才知道原來 Js Moth預設是從0開始的,所以應該把月都減1  

如 

Date(aDate[2], aDate[1]-1, aDate[0])
這樣計算就會得到正確的天數

還有一種用C#程式碼去算也是可以的程式碼如下:

1             int nights =0;
2             if (!string.IsNullOrEmpty(startTime) && !string.IsNullOrEmpty(endTime))
3             {
4                 System.TimeSpan td = Convert.ToDateTime(endTime) - Convert.ToDateTime(startTime);
5                 nights = td.Days + 1;
6               
7             }

 

相關文章