我试图根据用户的出生日期获得用户的年龄。出生日期以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
是什么给出了?
答案 0 :(得分:5)
边缘条件导致问题。
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。因此,没错。事实上,它按预期工作。
您应该比较月份和月份来解决此问题。
答案 1 :(得分:0)
使用joda:
DateTime jodaDob = new DateTime(dob);
DateTime now = new DateTime();
if (jodaDob.isAfter(now)) {
age = age - 1;
}
java.util.Date在joda负责的角落案件中有很多错误。