2010-10-07 28 views
7

請微啓我在此:添加一年Java日曆不起作用

我只是試圖到10年加入到當前的日期,那麼一個。減去到期日期從它返回的年數:

public int getMaxYears() { 
    int max = 0; 
    Calendar ten_year_later = Calendar.getInstance(); 
    ten_year_later.setTime(new Date()); 
    ten_year_later.add(Calendar.YEAR, 10); 
    Calendar expiration = Calendar.getInstance(); 
    expiration.setTime(expiration_date); 
    max = (int) (ten_year_later.getTimeInMillis() - expiration.getTimeInMillis())/(365 * 24 * 60 * 60 * 1000); 
    return max; 
} 

當我調試這個時,日曆總是停留在當年。

有人嗎?

+0

哪個日曆? ten_year_later還是過期? – 2010-10-07 15:21:37

+0

@ Paul Tomblin:ten_year_later ...我會編輯這個問題。 – codea 2010-10-07 15:30:19

+0

另外:一年不是365天,它必須佔閏年。對於粗略計算,365.25可行,但對於實際計算,您需要知道規則的內容......例如日曆。 – Anon 2010-10-07 15:34:40

回答

11

你必須爲int /長轉換的一個問題:365 * 24 * 60 * 60 * 1000 ,其評價至31536000000因此超過此作品:

public static void main(String[] args) { 
      Calendar ten_year_later = Calendar.getInstance(); 
      System.out.println(ten_year_later.getTime()); 
      ten_year_later.setTime(new Date()); 
      ten_year_later.add(Calendar.YEAR, 10); 
      System.out.println(ten_year_later.getTime()); 
      Calendar expiration = Calendar.getInstance(); 
      expiration.setTime(expiration.getTime()); 
      long max = (ten_year_later.getTimeInMillis() - expiration.getTimeInMillis())/(365 * 24 * 60 * 60 * 1000L); 
      System.out.println("max " + max); 
     } 
+0

+1:我認爲對於OP希望多年而不是四捨五入的情況,這樣做更好。 OP只需要記住,一年不一定有365天。 – BalusC 2010-10-07 15:32:53

+0

對!謝謝! – codea 2010-10-07 16:01:31

1

日曆是懶惰的,所以它可能不會重新計算所有其他字段,直到你問他們。之前我在調試器中拋出了這個問題。如果你System.out.println(ten_year_later);會發生什麼?

+0

'getTimeInMillis()'應該已經更新了'Calendar'的每個其他'get'方法的字段。 – BalusC 2010-10-07 15:27:20

+0

即使我打電話ten_year_later.getTimeInMillis()? max始終爲0會導致比今天晚expiration_date。 – codea 2010-10-07 15:30:46

+0

不,我是在調用getTimeInMillis()之前談論你在調試器中看到的內容。 – 2010-10-07 15:33:25

5

你的計算max是錯誤的。一個int不能持有一毫米。通過

max = ten_year_later.get(Calendar.YEAR) - expiration.get(Calendar.YEAR); 

或者更好

而是代替它,使用JodaTime

DateTime tenYearsLater = new DateTime().plusYears(10); 
DateTime expiration = new DateTime(expiration_date.getTime()); 
Period period = new Period(expiration, tenYearsLater); 
return period.getYears(); 
+0

這不行! 2020-01-01 - 2010-12-31 = 10.它應該給9 + 1天,所以9年; – codea 2010-10-07 15:33:53

+0

@elblanco:查看我對堆垛機答案的評論。 – BalusC 2010-10-07 15:34:24

+0

+1我完全同意,應按照您的指示進行計算。 – stacker 2010-10-07 16:12:27

3

下面是一個應該工作的簡單例子。

Calendar cal = new GregorianCalendar(); 
cal.setTime(new Date()); 
cal.add(Calendar.YEAR, yearsToAdd); 
Date retDate = cal.getTime(); 

只記得用一個很長的時間以毫秒爲單位!

+1

這是所有這些答案的唯一工作解決方案。 Thx Bryan! – rilar 2014-08-05 10:43:14

0

一年中的毫秒數超出了整數的範圍,因此ten_year_later.getTimeInMillis() - expiration.getTimeInMillis()的int cast和365 * 24 * 60 * 60 * 1000的計算結果都將計算爲不正確的值。

ten_year_later應該是正確的。 R. Bemrose寫道,不需要調用computeFields。

1

我在評論中指出,你在一年中計算的millis數不正確(從不介紹int/long問題)。

既然你有兩種曆法,每一個都可以保持一年,你爲什麼不寫你這樣的代碼(沒有編譯,所以可能包含錯別字):

Calendar cal1 = Calendar.newInstance(); // this will use current time 
cal1.add(Calendar.YEAR, 10); 
Calendar cal2 = Calendar.newInstance(); 
cal2.setDate(expiration); 
return cal1.get(Calendar.YEAR) - cal2.get(Calendar.YEAR); 

假設這是你真正想要...