如何计算Java中2个日期之间的年和月年龄

时间:2011-03-21 14:20:45

标签: java

我是新手,如果有人帮助我,我会感激不尽。

当我尝试使用以下来源计算年龄时,它并没有给我我想要的价值。例如:date-> 29/12/2010,dob-> 30/12/1992,它将给我18而不是17。 有没有什么方法可以根据上述2个日期而不是18yrs0mths来编码返回17年11个月?

public double getAgeAsOf( Date date ) {
        return ((date.getTime() - dob.getTime())/(1000*60*60*24))/365;
    }

感谢。

2 个答案:

答案 0 :(得分:18)

您可以使用Joda Time并在两个Period值之间计算LocalDate(这是您在此处获得的值),以月和年为单位。

示例代码:

import org.joda.time.*;

public class Test {
    public static void main(String[] args) {
        LocalDate dob = new LocalDate(1992, 12, 30);
        LocalDate date = new LocalDate(2010, 12, 29);

        Period period = new Period(dob, date, PeriodType.yearMonthDay());
        System.out.println(period.getYears() + " years and " +
                           period.getMonths() + " months");
    }
}

(这使用包含天数的句号类型,但这不会影响答案。)

一般来说,Joda Time是比使用日期/日历更好的API - 如果你能避免它,你真的不想自己开始执行日期计算。它很快就会变得混乱。

根据aioobe的回答,如果你划分两个整数表达式,算术将以整数运算执行,这可能不是你想要的 - 但对于日期和时间算术,只是让其他人在第一时间做艰苦的工作:)

上面的代码将使用ISO-8601日历,基本上是公历。如果您想使用其他内容,请在LocalDate的年/月/日之后将其指定为另一个构造函数参数。

答案 1 :(得分:3)

您的代码存在一些问题:

  1. 您正在进行整数除法,它会将结果截断为最接近的较低整数。

    例如,如果你将729除以365就会得到1(并且你已经丢失了小数部分,这在计算月数时就需要了)

  2. 另一个问题是你使用365天一年,而实际上接近365.25(由于闰年包括额外的天数)。

  3. 这是一段略有改进的代码片段:

    import java.util.Date;
    
    public class Test {
    
        static double msPerGregorianYear = 365.25 * 86400 * 1000;
    
        static Date dob = new Date(1992, 12, 30);
    
        public static double getAgeAsOf(Date date) {
            return (date.getTime() - dob.getTime()) / msPerGregorianYear;
        }
    
        public static void main(String[] args) {
    
            double years = getAgeAsOf(new Date(2010, 12, 29));
    
            // years == 17.99315537303217
    
            int yy = (int) years;
            int mm = (int) ((years - yy) * 12);
    
            // Prints   "17 years and 11 moths."
            System.out.printf("%d years and %d moths.", yy, mm);
        }
    }
    

    如果你做的事情比计算毫秒数的年数更复杂,我建议你转向Jon Skeet建议的Joda time等时间库。