我试图根据用户的出生日期输入计算用户年龄,并将其与今天的日期进行比较,以计算出他们的年龄(以年为单位(。如果他们不满12岁,他们将被拒绝。
int YearDiff;
public void ageCalc()
{
ZoneId nowBrit = ZoneId.of("Europe/London");
LocalDate timeBrit = LocalDate.now(nowBrit);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
int YearNow = Integer.parseInt(sdf.format(timeBrit));
int YearSel = Integer.parseInt(sdf.format(jDateChooserDOB.getDate()));
YearDiff = YearNow - YearSel;
}
然后将测试YearDiff变量,看看它在if语句中是否小于12,但它总是返回0。
此外,如果有更好的方法来进行年龄验证,请分享。
提前感谢
老式的SimpleDateFormat
类不能格式化像LocalDate
这样的java.time类的任何现代对象。因此,以下行抛出一个异常:
int YearNow = Integer.parseInt(sdf.format(timeBrit));
例外情况是java.lang.IllegalArgumentException: Cannot format given Object as a Date
。这会导致方法的其余部分无法执行。因此,您永远不会为YearDiff
指定任何值。作为一个字段,它的默认值为0,因此这就是您看到的结果。
显然你没有看到例外?如果是这样的话,那么无论是在代码(一个空的catch
块,称为"吞下异常"?(还是在项目设置中,都会遇到比错误结果更严重的问题。请先解决问题。
在我的家乡,人们在生日时比我大一岁,而不是在新年(当年份变化时(。我知道世界上并不是到处都是。在任何情况下,请在互联网上搜索根据您的文化计算年龄的正确方法。只跳过使用旧类和过时类的页面,如Date
、Calendar
、GregorianCalendar
、DateFormat
和SimpleDateFormat
。java.time使用起来更好,并且对年龄计算有更好的支持。
PS由于jDateChooserDOB.getDate()
返回一个老式的Date
,将其转换为Instant
,并从那里进行进一步的转换,例如:
int yearSel = jDateChooserDOB.getDate().toInstant().atZone(nowBrit).getYear();