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

时间:2018-12-05 05:10:27

标签: java date-difference jdatechooser java-date

我正在尝试根据他们的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。

如果还有更好的年龄验证方法,请分享。

预先感谢

1 个答案:

答案 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块,称为“吞咽异常”?),或者在进行项目设置,您将比不正确的结果更严重。请解决第一件事。

我来自哪里,人们在生日那天满一岁,而不是在新年(年份改变)。我知道世界上并非如此。无论如何,请在互联网上搜索根据您的文化计算年龄的正确方法。仅使用旧的和过时的类,例如DateCalendarGregorianCalendarDateFormatSimpleDateFormat跳过页面。 java.time更好用,并且对年龄计算有更好的支持。

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

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