使用ZoneId从jDateChooser计算年龄时一直返回0



我试图根据用户的出生日期输入计算用户年龄,并将其与今天的日期进行比较,以计算出他们的年龄(以年为单位(。如果他们不满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块,称为"吞下异常"?(还是在项目设置中,都会遇到比错误结果更严重的问题。请先解决问题。

在我的家乡,人们在生日时比我大一岁,而不是在新年(当年份变化时(。我知道世界上并不是到处都是。在任何情况下,请在互联网上搜索根据您的文化计算年龄的正确方法。只跳过使用旧类和过时类的页面,如DateCalendarGregorianCalendarDateFormatSimpleDateFormat。java.time使用起来更好,并且对年龄计算有更好的支持。

PS由于jDateChooserDOB.getDate()返回一个老式的Date,将其转换为Instant,并从那里进行进一步的转换,例如:

int yearSel = jDateChooserDOB.getDate().toInstant().atZone(nowBrit).getYear();

相关内容

  • 没有找到相关文章

最新更新