simpledateformat毁了我的currenttimemillis

时间:2012-11-06 18:08:45

标签: java

我的秒表给了我一个奇怪的时间。 它显示为16:00:00:000,它也将秒数放入毫秒槽。我认为问题是日期格式化程序。如果没有dateformater,只需使用十进制格式就可以正确显示。我只需要它来显示小时,分钟和秒钟。

public class StopWatchTest extends JLabel implements ActionListener {

    private static final String Start = "Start";
    private static final String Stop = "Stop";
    private SimpleDateFormat df = new SimpleDateFormat("HH:mm:ss.SSS");

    private Timer timer = new javax.swing.Timer(100, this);
    private long now = System.currentTimeMillis();

    public StopWatchTest() {
        this.setHorizontalAlignment(JLabel.CENTER);
        this.setText(when());
    }

    public void actionPerformed(ActionEvent ae) {
        setText(when());
    }

    public void start() {
        timer.start();
    }

    public void stop() {
        timer.stop();
    }

    private String when() {
        return df.format((System.currentTimeMillis() - now) / 1000d);
    }

    private static void create() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final StopWatchTest jtl = new StopWatchTest();
        jtl.setFont(new Font("Dialog", Font.BOLD, 32));
        f.add(jtl, BorderLayout.CENTER);

        final JButton button = new JButton(Stop);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String cmd = e.getActionCommand();
                if (Stop.equals(cmd)) {
                    jtl.stop();
                    button.setText(Start);
                } else {
                    jtl.start();
                    button.setText(Stop);
                }

            }
        });
        f.add(button, BorderLayout.SOUTH);
        f.pack();
        f.setVisible(true);
        jtl.start();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                create();
            }
        });
    }
}

2 个答案:

答案 0 :(得分:4)

DateFormat格式化由毫秒值指定的即时,并且您尝试使用它来格式化间隔。 JDK中没有任何内容涵盖您的用例,但JodaTime可以。无论如何你应该使用JodaTime。

答案 1 :(得分:0)

除了Marko指出的内容之外,您还尝试格式化未明确定义的double。 Java将从java.text.Format调用format(Object)函数。您至少应该使用Date对象作为参数,例如:

return df.format(new Date(System.currentTimeMillis() - now));

除了Marko,我认为这将以实际解决方案结束,但不要忘记:SimpleDateFormat不是线程安全的(感谢Alan)