2010-05-17 118 views

回答

21

首先你需要確定哪一個比另一個老。然後使用while循環,其中您測試較舊的不是新的after()。在舊版上添加一個(1Calendar.YEAR以調用Calendar#add()以添加年份。請保留一個櫃檯來計算這些年份。

開球例如:

Calendar myBirthDate = Calendar.getInstance(); 
myBirthDate.clear(); 
myBirthDate.set(1978, 3 - 1, 26); 
Calendar now = Calendar.getInstance(); 
Calendar clone = (Calendar) myBirthDate.clone(); // Otherwise changes are been reflected. 
int years = -1; 
while (!clone.after(now)) { 
    clone.add(Calendar.YEAR, 1); 
    years++; 
} 
System.out.println(years); // 32 

這就是說,在Java SE的DateCalendar的API實際上是史詩般的失敗。計劃即將到來的Java 8中有一個新的Date API,JSR-310Joda-Time非常相似。到目前爲止,您可能會考慮Joda-Time,因爲它可以減輕日期/時間計算/修改。下面是使用Joda-Time的示例:

DateTime myBirthDate = new DateTime(1978, 3, 26, 0, 0, 0, 0); 
DateTime now = new DateTime(); 
Period period = new Period(myBirthDate, now); 
int years = period.getYears(); 
System.out.println(years); // 32 

更清晰簡潔,不是嗎?

+6

或Years.yearsBetween(myBirthDate,現在).getYears(); – mtpettyp 2010-05-17 02:01:55

+0

我無法創建期間對象。它似乎是私人的java.util.time下...你能幫我嗎請怎麼才能找到使用期間的差異? – 2015-11-13 09:10:28

+0

@ Mr.Noddy:代碼片段是JodaTime而不是JavaTime。在JavaTime中,使用()'之間的'Period#。另請參閱javadoc https://docs.oracle.com/javase/8/docs/api/java/time/Period.html – BalusC 2015-11-13 09:53:59

0

或者你可以只使用Calendar.getTimeInMillis()

long msYear = 1000L * 60 * 60 * 24 * 365; 
long msDiff = c2.getTimeInMillis() - c1.getTimeInMillis(); 
System.out.println("Years diff: " + String.valueOf(msDiff/msYear)); 

編輯 這忽略閏年。但是如果你正在尋找一個閏年的整數表示,那麼閏年與半個千年左右的時間無關。例如,這對計算某人的年齡有很大的準確性。但不夠準確,不足以告訴他們的生日。

如果您需要的年份差異比人類壽命期內的三位有效數字更準確(大約80.00年vs 80.05),則應使用「官方」解決方案。

如果沒有,沒有什麼特別的理由需要額外的努力來達到一定程度的精度,你不會使用它。

+3

這是閏年,閏分等嗎? – 2010-05-17 01:38:45

+0

沒有。假設如果你正在尋找幾年的倍數,你不會過分擔心一兩天的不匹配。如果您在維基百科中查看一年中的確切時間長度,您可以從長遠角度儘可能接近您的期望。 – 2010-05-17 01:45:48

+0

@Nick:飛躍*分鐘* ?? – 2010-05-17 06:22:25

10
Calendar dobDate; // Set this to date to check 
Calendar today = Calendar.getInstance(); 
int curYear = today.get(Calendar.YEAR); 
int curMonth = today.get(Calendar.MONTH); 
int curDay = today.get(Calendar.DAY_OF_MONTH); 

int year = dobDate.get(Calendar.YEAR); 
int month = dobDate.get(Calendar.MONTH); 
int day = dobDate.get(Calendar.DAY_OF_MONTH); 

int age = curYear - year; 
if (curMonth < month || (month == curMonth && curDay < day)) { 
    age--; 
} 

這樣可以避免循環,並且應該準確無誤。

2
double diff = d2.getTime() - d1.getTime(); 
double d = 1000 * 60 * 60 * 24 * 365; 
return (int) Math.round(diff/d); 

(java.lang.Math中)

+3

注意:小心閏年和其他這樣的日曆古怪。 – michaelb958 2013-06-03 07:48:14

相關問題