使用 ZoneId 从 jDateChooser 计算年龄不断返回 0

Calculating age from jDateChooser using ZoneId keeps returning 0

我正在尝试根据输入的 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,但它总是 returns 0.

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

提前致谢

老式 SimpleDateFormat class 无法格式化 java.time class 等 LocalDate 的任何现代对象。因此,以下行抛出异常:

    int YearNow = Integer.parseInt(sdf.format(timeBrit));

例外是 java.lang.IllegalArgumentException: Cannot format given Object as a Date。这会导致您的方法的其余部分不被执行。因此,您永远不会为 YearDiff 分配任何值。作为一个字段,它的默认值为 0,因此这就是您看到的结果。

你好像没看到异常?如果是这样,那么你遇到了比错误结果更严重的问题,无论是在你的代码中(一个空的 catch 块,称为“吞噬异常”?)或你的项目设置。请先修复。

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

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

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