我是新手,如果有人帮助我,我会感激不尽。
当我尝试使用以下来源计算年龄时,它并没有给我我想要的价值。例如: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;
}
感谢。
答案 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)
您的代码存在一些问题:
您正在进行整数除法,它会将结果截断为最接近的较低整数。
例如,如果你将729除以365就会得到1(并且你已经丢失了小数部分,这在计算月数时就需要了)
另一个问题是你使用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 time等时间库。