Leapday抵消 - 清洁解决方案任何人?

时间:2016-12-13 19:52:51

标签: java leap-year

我需要为某个人的年龄定义开始/结束日期。这看起来很简单:

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);

0 个答案:

没有答案