如何在Java中计算两个日历之间的年份差异?
首先你需要确定哪一个比另一个年龄大。然后使用一个 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中的Date
和Calendar
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
更加清晰简洁,是不是?
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--;
}
这样可以避免循环,并且应该可以精确到天数。double diff = d2.getTime() - d1.getTime();
double d = 1000 * 60 * 60 * 24 * 365;
return (int) Math.round(diff / d);
(java.lang.Math)
或者你可以直接使用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年)内的三个有效数字更精确的年份差异,则应使用“官方”解决方案。
如果不需要,那么没有特别的理由为了一个您不会使用的精度而付出额外的努力。
Period#between()
。另请参阅javadoc https://docs.oracle.com/javase/8/docs/api/java/time/Period.html - BalusC