我需要为某个人的年龄定义开始/结束日期。这看起来很简单:
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(dateOfBirth);
cal.add(Calendar.YEAR, years);
Date start = cal.getTime();
cal.add(Calendar.YEAR, 1);
cal.add(Calendar.DAY_OF_MONTH, -1);
Date end = cal.getTime();
啊,但是那些出生在2月29日闰日的人。如果年龄不是4的倍数,那么日历将向下舍入到第28位。在这种情况下,我上面的代码将给出一个截止日期为2月27日的日期范围,并且会有差距。
所以,我可以通过检查这个条件轻松解决这个问题,我可以用一些方法包装修复程序,以避免在任何地方重复它。但我想知道,有没有更好的解决方案我不知道?在#34;之前/之后的一天,自动解释这种特殊情况的东西;问题?
这是我的解决方案:
public static Date getAgeStartEnd(Date d, int age, boolean end) {
if (d == null) return null;
GregorianCalendar cal = new GregorianCalendar();
cal.setTime(d);
int baseDay = cal.get(Calendar.DAY_OF_MONTH);
cal.add(Calendar.YEAR, age + (end ? 1 : 0));
int newDay = cal.get(Calendar.DAY_OF_MONTH);
boolean roundedDown = baseDay != newDay;
if (end && !roundedDown)
cal.add(Calendar.DAY_OF_MONTH, -1);
else if (!end && roundedDown)
cal.add(Calendar.DAY_OF_MONTH, 1);
d = cal.getTime();
return d;
}
Date start = getAgeStartEnd(dateOfBirth, years, false);
Date end = getAgeStartEnd(dateOfBirth, years, true);