如何计算Java中两个日期之间的年份和月份

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

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

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

谢谢。

您可以使用Joda Time并使用月份和年份作为单位计算两个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. 你正在进行整数除法,它将结果截断为最接近的较低整数。

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

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

这是一个稍微改进的代码片段:

 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时间 。