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

标签 java date-difference jdatechooser date

我正在尝试根据用户输入的出生日期来计算用户的年龄,并将其与今天的日期进行比较,以计算出他们的年龄(以岁为单位)。如果他们未满 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类无法格式化java.time类的任何现代对象,例如LocalDate。因此下面的行会抛出异常:

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

异常(exception)是java.lang.IllegalArgumentException:无法将给定对象格式化为日期。这会导致方法的其余部分不被执行。因此,您永远不会为 YearDiff 分配任何值。它是一个字段,默认值为 0,因此这就是您看到的结果。

显然你没有看到异常?如果是这样,那么无论是在您的代码(空的 catch block ,称为“吞咽异常”?)还是您的项目设置中,您都会遇到比错误结果更严重的问题。请解决第一件事。

在我的家乡,人们会在生日时变老一岁,而不是在新年(当年份发生变化时)。我知道世界各地并非如此。无论如何,请在互联网上搜索根据您的文化计算年龄的正确方法。仅跳过使用旧的和过时的类的页面,例如 DateCalendarGregorianCalendarDateFormat SimpleDateFormat。 java.time 更好用,并且对年龄计算有更好的支持。

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

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

关于java - 使用 ZoneId 从 jDateChooser 计算年龄不断返回 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53625517/

相关文章:

java - @Service 和 @Scope ("prototype") 一起

java - 如何计算年龄或java中两个日期之间的差异

C# - 以分钟为单位计算时差

java - 计算包括两个给定日期的天数

Java Applet 不工作,警告/错误 : can't fully enable headless mode

java - 使用 Eclipse 外部化字符串 - 如何获取 XYZ 语言的字符串?

java - 如何使用 jdatechooser 从 mysql 数据库中保存和检索空日期

Java DatePicker 弹出日历

java - Tomcat 获取 Java 堆空间

java - 将日期从 JDateChooser 插入到 MySql 数据库