java - 尽管值正确,JSpinner 显示的时间仍具有恒定的小时偏移量

标签 java swing time jspinner

我有下面的代码应该在 JSpinner 对象中显示时间

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));

cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.AM_PM, 0);
cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

spStartTime = new JSpinner(new CustomSpinnerModel(cal.getTime(), null, null, cal.get(Calendar.HOUR_OF_DAY), 100, "start"));

((JSpinner.DefaultEditor) spStartTime.getEditor()).getTextField().setFormatterFactory(new DefaultFormatterFactory(new DateFormatter(new SimpleDateFormat("hh:mm:ss,SSS"))));

CustomSpinnerModel 扩展了 SpinnerDateModel,我重写了 getNextValue() 和 getPreviousValue()。

public Object getNextValue()
{
    Object next = super.getValue();
    Calendar calendar = new GregorianCalendar();

    calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
    calendar.setTime((Date) next);

    Date helper = new Date(calendar.getTimeInMillis() + defaultStep);

    calendar.setTime(helper);

    System.out.println(calendar.getTimeInMillis());
    return calendar.getTime();
}

现在,我第一次点击向上箭头时会打印 100 毫秒,这意味着该值是正确的,因为我从 0 毫秒开始。问题是我在 JSpinner 中看到的是

02:00:00,100

可视化中存在恒定的 2 小时偏移。

最佳答案

我认为DateFormat#setTimeZone(TimeZone)是您正在寻找的:

//((JSpinner.DefaultEditor) spStartTime.getEditor()).getTextField()
//  .setFormatterFactory(new DefaultFormatterFactory(
//    new DateFormatter(new SimpleDateFormat("hh:mm:ss,SSS"))));
SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss,SSS");
format.setTimeZone(TimeZone.getTimeZone("GMT"));
((JSpinner.DefaultEditor) spStartTime.getEditor()).getTextField()
    .setFormatterFactory(new DefaultFormatterFactory(
      new DateFormatter(format)));
import java.awt.*;
import java.text.*;
import java.util.*;
import javax.swing.*;
import javax.swing.text.*;

public class DateEditorTimeZoneTest {
  public JComponent makeUI() {
    SimpleDateFormat format = new SimpleDateFormat("HH:mm:ss,SSS");
    format.setTimeZone(TimeZone.getTimeZone("GMT"));

    Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    cal.clear(Calendar.HOUR_OF_DAY);
    cal.clear(Calendar.AM_PM);
    cal.clear(Calendar.HOUR);
    cal.clear(Calendar.MINUTE);
    cal.clear(Calendar.SECOND);
    cal.clear(Calendar.MILLISECOND);

    Date start = cal.getTime();
    System.out.println(start);
    System.out.println(format.format(start));

    int defaultStep = 100;
    JSpinner spinner = new JSpinner(new SpinnerDateModel(
            start, null, null, Calendar.MILLISECOND) {
      @Override public void setCalendarField(int calendarField) {
        // If you only want one field to spin you can subclass
        // and ignore the setCalendarField calls. 
      }
      @Override public Object getNextValue() {
        Object next = super.getValue();
        Calendar calendar = new GregorianCalendar();
        calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
        calendar.setTime((Date) next);
        Date helper = new Date(calendar.getTimeInMillis() + defaultStep);
        calendar.setTime(helper);
        System.out.println(calendar.getTimeInMillis());
        return calendar.getTime();
      }
      //@Override public Object getPreviousValue() {
      //  //...
      //}
    });
    JSpinner.DateEditor editor = new JSpinner.DateEditor(spinner, "HH:mm:ss,SSS");
    spinner.setEditor(editor);
    editor.getTextField().setFormatterFactory(
        new DefaultFormatterFactory(new DateFormatter(format)));

    JPanel p = new JPanel();
    p.add(spinner);
    return p;
  }
  public static void main(String... args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new DateEditorTimeZoneTest().makeUI());
      f.setSize(320, 240);
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}

关于java - 尽管值正确,JSpinner 显示的时间仍具有恒定的小时偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42247801/

相关文章:

python - 你如何使用python将本地时间(PDT)转换为PST

php - 查看某个时间段是否与当前时间匹配

java - 将 PDF 文件更新为 mysql BLOB 您的 SQL 语法有误;

java - 手动鼠标拖动调整包含 JScrollPane 的 JOptionPanel 的大小

java - 使用Keylistener后如何重新绘制图形?

java - 如何在java中添加更新的JTextfield值? [文档监听器]

sql - SQL Server 中的分钟数

java - 更改 JTable 关键操作的行为

java - 所以这是代码 : But it never considers the first string i write? 即使它仅以第一个单词结尾,它也不会计算在内

java - c3p0 - maxIdleTime 配置