如何使用LocalTime对象设置JSpinner的值?

问题描述

我正在尝试使用JSpinner和Java 8的时间API创建时间选择器。我想做一个没有日期的时间选择器。

之前,我使用的是SimpleDateFormat,但是当我打印出JSpinner的值时,它将返回带有日期的时间。

那么如何将LocalTime对象的值传递给JSpinner的setValue方法

这是我当前的代码

JSpinner timeSpinner = new JSpinner(new SpinnerDateModel());
JSpinner.DateEditor timeEditor = new JSpinner.DateEditor(timeSpinner,"HH:mm");
timeSpinner.setEditor(timeEditor);
LocalTime newTime = LocalTime.of(11,9);
timeSpinner.setValue(newTime);
        
timeSpinner.setBounds(126,55,56,22);
contentPanel.add(timeSpinner);

还是我采取了错误方法

这是我的原始代码,可以正常工作:

JSpinner timeSpinner = new JSpinner(new SpinnerDateModel());
JSpinner.DateEditor timeEditor = new JSpinner.DateEditor(timeSpinner,"HH:mm");
timeSpinner.setEditor(timeEditor);
SimpleDateFormat time = new SimpleDateFormat("HH:mm");
try {
    timeSpinner.setValue(time.parSEObject("10:00"));
} catch (ParseException timeError) {
    timeError.printstacktrace();
}
timeSpinner.setBounds(126,22);
contentPanel.add(timeSpinner);

解决方法

是的,类getValue()的方法SpinnerDateModel返回一个java.util.Date()的实例,但是您可以按如下所示将其转换为LocalTime

Object obj = timeSpinner.getValue();
if (obj instanceof java.util.Date) {
    java.util.Date theDate = (java.util.Date) obj;
    java.time.Instant inst = theDate.toInstant();
    java.time.ZoneId theZone = java.time.ZoneId.systemDefault();
    java.time.LocalTime thetime = java.time.LocalTime.ofInstant(inst,theZone); // Since JDK 9
    /*
    LocalTime.from(ZonedDateTime.ofInstant(inst,theZone)); // Since JDK 8
     */
    System.out.println(thetime);
}

如您所见,有两种方法可以将java.util.Date转换为LocalTime,具体取决于您使用的是哪个JDK版本。

以上代码将以theTime格式打印HH:mm