2012-08-06 159 views
0

計算兩個日期(java.util.Date)之間的差異,的日子看起來很簡單,我們可以找到不同的方式來做到這一點。我用下面的代碼來計算日期差:計算java時出錯日期差異

public static long daysBetween(Calendar startDate, Calendar endDate) { 
     Calendar date = (Calendar) startDate.clone(); 
     long daysBetween = 0; 
     while (date.before(endDate)) { 
      date.add(Calendar.DAY_OF_MONTH, 1); 
      daysBetween++; 
     } 
     return daysBetween; 
    } 

main(),我用下面的兩個日期:

Calendar c1 = Calendar.getInstance(); 
    c1.set(2011, 1, 1); 
    Calendar c2 = Calendar.getInstance(); 
    c2.set(2011, 1, 31); 

    long difference = daysBetween(c1, c2); // 

但變量difference的價值是不相符的。有時候是30,有時候是31.所以,爲什麼會發生這種情況。

是否有任何解決方案使用該方法結果一致的輸出?

+0

我跑了幾次,我只得到30而不是31。 – sakthi 2012-08-06 13:13:33

回答

3

你設置日曆的日期部分,但不是時間一部分。

有時候時鐘會在getInstance()的調用之間打勾,有時它不會,因此不一致。

選項:

  • 設置時間以及日期,例如到午夜
  • 使用更好的日期/時間庫 - Joda Time - 它有一個更合適的表示形式(LocalDate)。這裏一個重要的道德是,如果你能找到一種代表你所擁有的確切信息的類型,而不是別的,那麼這可能是一個很好的選擇,並且會導致更少的併發症。

使用LocalDate,您甚至不需要執行循環,因爲Joda Time對計算兩個值之間的差異有很好的支持。

LocalDate date1 = new LocalDate(2011, 1, 1); 
LocalDate date2 = new LocalDate(2011, 1, 31); 
Days period = Days.daysBetween(days1, days2); 
int days = period.getDays(); 
2

您只設置年,月和日。小時,分鐘,秒和毫秒的當前時間(因而不同的每次運行它時)

我建議你使用喬達時間的,而不是LOCALDATE,因爲它似乎你想要做什麼。