使用GregorianCalendar()来确定mm:ss格式的经过时间,mm:ss格式会发生什么?

时间:2015-05-26 05:12:58

标签: java

我已完成学位并正在尝试,试图提升我对Java的理解。就个人而言,最好的学习方法是这样做,我已经开始一次完成一个项目。基本上,我想确定并动态显示程序运行所经过的时间。您会注意到我有一个JTextField格式化显示已用时间,并且我调用了System.out.println()方法来记录我的总输出。

以下是代码:

import static java.lang.Thread.sleep;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class TimeFormat extends JFrame {

    public static void main(String[] args) {
        Calendar cal = new GregorianCalendar();
        JTextField btf = new JTextField(3);
        JPanel b = new JPanel();   
        JFrame f=new JFrame("");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        

        Thread clock = new Thread(){
            public void run() {
                // Start time
                int m = cal.get(Calendar.MINUTE);
                int s = cal.get(Calendar.SECOND);
                // Begin loop to calculate elapsed time
                for(;;) {
                    Calendar cal = new GregorianCalendar();
                    int mm = cal.get(Calendar.MINUTE);
                    int ss = cal.get(Calendar.SECOND);

                    // MM:SS format
                    if ((mm-m)<10 && (ss-s)<10) {
                        btf.setText("0"+(mm-m)+":0"+(ss-s));
                        System.out.println("0"+(mm-m)+":0"+(ss-s));
                    } else if ((mm-m)<10) {
                        btf.setText("0"+(mm-m)+":"+(ss-s));
                        System.out.println("0"+(mm-m)+":"+(ss-s));
                    } else {
                        btf.setText((mm-m)+":"+(ss-s));
                        System.out.println((mm-m)+":"+(ss-s));
                    }

                    try {
                        sleep(1000);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(TimeFormat.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        };
        clock.start();

        b.add(btf);
        f.add(b);
        f.setSize(100, 100);
        f.setVisible(true);
    }  
}

结果将在大多数情况下正确格式化。该计划将从00:00开始,一直运行到00:53。在00:54我得到01:0-6。这将一直持续到00:59 (01:0-1)。然后,它会在01:00正常恢复到01:53。那时我得到02:0-6。为什么不能在每分钟的最后六秒内正确格式化?

00:00
...
00:53
01:0-6 (00:54)
...
01:0-1 (00:59)
01:00
...
01:53
02:0-6 (1:54)
...
02:0-1 (1:59)
02:00
...  

过去四天我一直在谷歌和论坛上试图弄清楚如何动态显示过去的时间,这是我发现的唯一可以操作最简单的时间。我已经尝试了JFormattedTextFieldMaskFormatterSimpleDateFormat以及此各种组合的当前方法,但直到现在还没有成功。我注意到Joda Time的几个引用最适合确定经过的时间。我还没有尝试过,但本周计划一下。那六秒虽然......为什么?我很欣赏任何和所有见解。

1 个答案:

答案 0 :(得分:1)

您的代码假定ss始终大于smm始终大于m但是并非总是如此。例如,如果您在01:59:59开始申请,那么2秒后在02:01:01,ss = 1(小于s = 59),mm = 1(小于m = 59

您可以使用System.currentTimeMillis():

而不是使用Calendar
long t = System.currentTimeMillis()
...
long ms = System.currentTimeMillis() - t
long m = ms / 60000
long s = ms % 60000