我的程序中有一个JDateChooser。每当从JDateChooser中选择他的出生日期时,我希望他的年龄显示在JTextField中。
最初,我尝试将其与MouseListener一起使用:
private void jDateChooser1MouseExited(java.awt.event.MouseEvent evt)
{
Calendar dob = Calendar.getInstance();
//utilDob is a java.util.Date variable which stores date selected by user
dob.setTime(utilDob);
Calendar today = Calendar.getInstance();
int age = today.get(Calendar.YEAR) - dob.get(Calendar.YEAR);
if (today.get(Calendar.MONTH) < dob.get(Calendar.MONTH))
age--;
else if (today.get(Calendar.MONTH) == dob.get(Calendar.MONTH)
&& today.get(Calendar.DAY_OF_MONTH) < dob.get(Calendar.DAY_OF_MONTH))
age--;
jTextField11.setText(Integer.toString(age));
displayAge=Integer.parseInt(jTextField11.getText());
}
但是,上面提到的功能并没有帮助我。我可以使用其他任何事件/动作监听器吗?
答案 0 :(得分:0)
您正在使用过时的课程。
Java 8及更高版本内置了java.time框架。
LocalDate
LocalDate
类表示仅限日期的值,没有时间和没有时区。但是时区对于确定“今天”至关重要。对于任何特定时刻,日期可能因时区而异。在巴黎午夜过后的一段时间,蒙特利尔仍然是“昨天”。
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
LocalDate today = LocalDate.now ( zoneId );
根据您的用户输入建立出生日期。
LocalDate dob = LocalDate.of ( 1955 , 1 , 2 );
或者解析符合ISO 8601标准的字符串。
LocalDate dob = LocalDate.parse( "1955-01-02" );
或者使用DateTimeFormatter
来帮助解析不同的字符串。
如果您手头有java.util.Date
个对象,请使用添加到该旧类的新方法转换为java.time:java.util.Date::toInstant
。 Instant
是UTC时间轴上的一个时刻。
Instant instant = myJavaUtilDate.toInstant();
Apple是一个时区。
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId );
提取LocalDate
。
LocalDate localDate = zdt.toLocalDate();
Period
年龄只是一种经过的时间,一段时间。在java.time中,Period
类表示按年,月和日跟踪的时间跨度。
Period age = Period.between ( dob , today );
Period
询问这些年份,如果这就是你想要的。
int years = age.getYears ();
请注意,getYears
不标准化为完整的年数,因为您可能会直觉。根据{{1}}的构造方式,您可能会得到意外的结果。另一种方法是调用Period
并除以12(十二个月到一年)。在这个快速示例中查看两种方法;比较toTotalMonths()
和y
。
y2
p:P25M | y:0 |是2:2
更好的是,强制将Period p = Period.ofMonths ( 25 );
int y = p.getYears ();
long y2 = ( ( p.toTotalMonths () ) / 12 );
System.out.println ( "p: " + p + " | y: " + y + " | y2: " + y2 );
对象标准化为完整的年数,然后是几天甚至几天。好吧,不是完全强制对象:因为immutable objects,你实际上是根据原始对象的值实例化一个新对象。
因此,虽然我们的Period
对象由于其特殊结构而已经正常化,但总是调用age
可能是一个好习惯。
normalized
转储到控制台。默认情况下,Period age = Period.between ( dob , today ).normalized();
方法会根据此处显示的ISO 8601 standard for Durations生成字符串,例如Period::toString
。
P61Y2M27D
zoneid:美国/蒙特利尔|今天:2016-03-29 |多布:1955-01-02 |年龄:P61Y2M27D |年:61
System.out.println ( "zoneid: " + zoneId + " | today: " + today + " | dob: " + dob + " | age: " + age + " | years: " + years );
转换为int
最后,如果您需要对象而不是基元,请将Integer
转换为int
。
Integer yearsObj = Integer.valueOf(years);