【问题标题】:JSpinner.DateEditor in Java Not Respecting TimeZone on InitializationJava中的JSpinner.DateEditor在初始化时不尊重时区
【发布时间】:2016-09-23 11:32:59
【问题描述】:

我正在对使用 java 日期和 Swing 的 JSpinner 作为 DateEditor 的现有 Swing 应用程序进行错误修复。我试图让编辑器默认使用 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 时间显示?

【问题讨论】:

    标签: java swing date jspinner


    【解决方案1】:

    有趣的错误。对我有用的解决方法是将微调器的初始值设置为 new Date(0)(即 1970 年 1 月 1 日),然后在调整编辑器后调用 spinner.setValue(new Date())

    真正的问题是 Spinner 似乎没有更新其文本以响应编辑器属性的更改。事实上,JSpinner 文档表明 editor 属性根本不是绑定属性。所以另一种解决方法是在编辑器更改时强制 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();
        }
    };
    

    【讨论】:

    • 谢谢,这是我们正在考虑的一种可能的解决方法。但这似乎更像是 hack,所以我们想看看是否有更合适的方法来做这件事,然后才决定将其作为一种解决方法。
    • @JohnnyO 添加了另一个解决方法。不幸的是,它仍然是一个黑客。我不知道 JSpinner 的任何标准使用都会让它根据编辑器的更改进行更新。
    猜你喜欢
    • 2011-11-23
    • 2021-02-12
    • 2018-05-24
    • 2011-06-14
    • 2013-03-22
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多