如何计算两个日期之间的年数差异?

14

如何在Java中计算两个日历之间的年份差异?

4个回答

21

首先你需要确定哪一个比另一个年龄大。然后使用一个 while 循环,在其中测试年龄较大的那个是否没有 after() 年龄较小的那个。调用 Calendar#add() 将年份添加到年龄较大的那个上,增加的年份数为一 (1) 个 Calendar.YEAR 。保持一个计数器来计算年数。

启动示例:

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中有一个新的日期API计划JSR-310,它与Joda-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
myBirthDate 是你的出生日期,now 是当前时间。yearsBetween() 函数返回两个日期之间相差的年数,getYears() 函数从该年份差异中提取年数。因此,这一行代码的作用是计算你的年龄。 - mtpettyp
我无法创建Period对象。它似乎在java.util.time下是私有的...你能帮我解决一下吗?请问如何使用Period找到年份差异? - Mr. Noddy
@Mr.Noddy:代码片段是JodaTime而不是JavaTime。在JavaTime中,请使用Period#between()。另请参阅javadoc https://docs.oracle.com/javase/8/docs/api/java/time/Period.html - BalusC

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--GoFundMonica

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年与80.05年)内的三个有效数字更精确的年份差异,则应使用“官方”解决方案。

如果不需要,那么没有特别的理由为了一个您不会使用的精度而付出额外的努力。


3
这是否考虑了闰年、闰秒等? - Nick Presta
不。假设您正在寻找多年的时间,您可能并不过于关心一两天的不匹配。如果您在维基百科上查找确切的年长,您可以在长期内尽可能接近它。 - j-g-faustus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接