我正在尝试根据他们的DOB输入来计算用户年龄,并将其与今天的日期进行比较,以得出他们的年龄(以年为单位)。如果他们未满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。
如果还有更好的年龄验证方法,请分享。
预先感谢
答案 0 :(得分:1)
老式的SimpleDateFormat
类无法格式化任何Java.time类的现代对象,例如LocalDate
。因此,以下行将引发异常:
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();