2010-05-17 185 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

相关问题