我正在尝试根据用户输入的出生日期来计算用户的年龄,并将其与今天的日期进行比较,以计算出他们的年龄(以岁为单位)。如果他们未满 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 ,称为“吞咽异常”?)还是您的项目设置中,您都会遇到比错误结果更严重的问题。请解决第一件事。
在我的家乡,人们会在生日时变老一岁,而不是在新年(当年份发生变化时)。我知道世界各地并非如此。无论如何,请在互联网上搜索根据您的文化计算年龄的正确方法。仅跳过使用旧的和过时的类的页面,例如 Date
、Calendar
、GregorianCalendar
、DateFormat
和 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/