使用 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 的页面,例如 Date
、Calendar
、GregorianCalendar
、DateFormat
和 SimpleDateFormat
。 java.time 更易于使用并且对年龄计算有更好的支持。
PS 由于 jDateChooserDOB.getDate()
returns 是老式的 Date
,请将其转换为 Instant
并从那里执行进一步的转换,例如:
int yearSel = jDateChooserDOB.getDate().toInstant().atZone(nowBrit).getYear();
我正在尝试根据输入的 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 的页面,例如 Date
、Calendar
、GregorianCalendar
、DateFormat
和 SimpleDateFormat
。 java.time 更易于使用并且对年龄计算有更好的支持。
PS 由于 jDateChooserDOB.getDate()
returns 是老式的 Date
,请将其转换为 Instant
并从那里执行进一步的转换,例如:
int yearSel = jDateChooserDOB.getDate().toInstant().atZone(nowBrit).getYear();