JSpinner.DateEditor in Java 初始化时不考虑时区
JSpinner.DateEditor in Java Not Respecting TimeZone on Initialization
我正在修复现有 Swing 应用程序的错误,该应用程序使用 java 日期和 Swing 的 JSpinner 作为 DateEditor。我试图让编辑器默认使用 UTC 来显示时间,而不是我们当地的时区。该应用程序在 Windows 上 运行,使用 Java 8.
我使用的代码如下。
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;
public class Test {
public static void main(String [] args) {
// Initialize some sample dates
Date now = new Date(System.currentTimeMillis());
JSpinner spinner = new JSpinner();
// Create model with a current date and no start/end date boundaries, and set it to the spinner
spinner.setModel(new SpinnerDateModel(now, null, null, Calendar.MINUTE));
// Create new date editor with a date format string that also displays the timezone (z)
// Set the format's timezone to be UTC, and finally set the editor to the spinner
JSpinner.DateEditor startTimeEditor = new JSpinner.DateEditor(spinner, "yyyy-MMM-dd HH:mm zzz");
startTimeEditor.getFormat().setTimeZone(TimeZone.getTimeZone("UTC"));
spinner.setEditor(startTimeEditor);
JPanel panel = new JPanel();
panel.add(spinner);
JOptionPane.showConfirmDialog(null, panel);
}
}
但是,此代码存在初始化问题。当对话框首次出现时,时间显示为我们当地的时区,而不是 UTC。一旦用户首次通过单击与该字段进行交互,它就会切换到 UTC 并从此正常工作。
如何让字段以 UTC 时间显示?
有趣的错误。对我有用的解决方法是将微调器的初始值设置为 new Date(0)
(即 1970 年 1 月 1 日),然后在调整编辑器后调用 spinner.setValue(new Date())
.
真正的问题是 Spinner 似乎没有更新其文本以响应编辑器中的更改 属性。事实上,JSpinner 文档表明编辑器 属性 根本不是绑定 属性。因此,另一个解决方法是在编辑器更改时强制 Spinner 更新:
SpinnerModel model = new SpinnerDateModel(now, null, null, Calendar.MINUTE);
JSpinner spinner = new JSpinner(model) {
@Override
public void setEditor(JComponent editor) {
super.setEditor(editor);
fireStateChanged();
}
};
我正在修复现有 Swing 应用程序的错误,该应用程序使用 java 日期和 Swing 的 JSpinner 作为 DateEditor。我试图让编辑器默认使用 UTC 来显示时间,而不是我们当地的时区。该应用程序在 Windows 上 运行,使用 Java 8.
我使用的代码如下。
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.SpinnerDateModel;
public class Test {
public static void main(String [] args) {
// Initialize some sample dates
Date now = new Date(System.currentTimeMillis());
JSpinner spinner = new JSpinner();
// Create model with a current date and no start/end date boundaries, and set it to the spinner
spinner.setModel(new SpinnerDateModel(now, null, null, Calendar.MINUTE));
// Create new date editor with a date format string that also displays the timezone (z)
// Set the format's timezone to be UTC, and finally set the editor to the spinner
JSpinner.DateEditor startTimeEditor = new JSpinner.DateEditor(spinner, "yyyy-MMM-dd HH:mm zzz");
startTimeEditor.getFormat().setTimeZone(TimeZone.getTimeZone("UTC"));
spinner.setEditor(startTimeEditor);
JPanel panel = new JPanel();
panel.add(spinner);
JOptionPane.showConfirmDialog(null, panel);
}
}
但是,此代码存在初始化问题。当对话框首次出现时,时间显示为我们当地的时区,而不是 UTC。一旦用户首次通过单击与该字段进行交互,它就会切换到 UTC 并从此正常工作。
如何让字段以 UTC 时间显示?
有趣的错误。对我有用的解决方法是将微调器的初始值设置为 new Date(0)
(即 1970 年 1 月 1 日),然后在调整编辑器后调用 spinner.setValue(new Date())
.
真正的问题是 Spinner 似乎没有更新其文本以响应编辑器中的更改 属性。事实上,JSpinner 文档表明编辑器 属性 根本不是绑定 属性。因此,另一个解决方法是在编辑器更改时强制 Spinner 更新:
SpinnerModel model = new SpinnerDateModel(now, null, null, Calendar.MINUTE);
JSpinner spinner = new JSpinner(model) {
@Override
public void setEditor(JComponent editor) {
super.setEditor(editor);
fireStateChanged();
}
};