我正在尝试根据用户的出生日期获取用户的年龄。出生日期以 XML 中的字符串形式给出,并转换为 Calendar
,如下所示:
final Calendar dob = javax.xml.bind.DatatypeConverter.parseDate(value);
然后我像这样计算用户的年龄:
final Calendar now = Calendar.getInstance();
int age = now.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
if (now.get(Calendar.DAY_OF_YEAR) < dob.get(Calendar.DAY_OF_YEAR)) {
--age;
}
我今天发现,如果今天是用户的生日(收起派对帽,那不是我的生日),那么年龄就会小一岁。也就是说,如果用户是 2000 年出生的,今天是她的生日,那么她应该是 14 岁,而不是 13 岁。但归根结底,Java 似乎把 DAY_OF_YEAR 弄错了:
System.out.println(String.format("Today: %d-%d; Birthday: %d-%d", now.get(Calendar.MONTH), now.get(Calendar.DAY_OF_MONTH), dob.get(Calendar.MONTH), dob.get(Calendar.DAY_OF_MONTH)));
// prints: Today: 9-22; Birthday: 9-22
System.out.println(String.format("Today: %d; Birthday: %d", now.get(Calendar.DAY_OF_YEAR), dob.get(Calendar.DAY_OF_YEAR)));
// prints: Today: 295; Birthday: 296
什么给了?
最佳答案
边缘条件导致了问题。
2000 有什么特别之处?
今年是闰年。
Calendar cal = new GregorianCalendar();
cal.set(2000, 11, 31);
System.out.println(cal.getTime());
System.out.println(cal.get(Calendar.DAY_OF_YEAR));
输出:
Sun Dec 31 13:43:28 EST 2000
366
2 月 29 日之后的所有内容都被 1 抵消,特别是对于闰年。因此,这没有错。事实上,它正在按预期工作。
您应该比较月份和日期来解决这个问题。
关于Java Calendar.DAY_OF_YEAR 有时差一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26513482/