繁体   English   中英

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

[英]Using GregorianCalendar() to determine elapsed time in mm:ss format, what is happening with mm:ss format?

我已经完成学位并正在尝试,以增进对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:0001: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
...  

最近四天我一直在Google和论坛上浏览,试图弄清楚如何动态显示经过的时间,这是我发现的唯一可以操作的最简单的方法。 JFormattedTextField ,我已经尝试过JFormattedTextFieldMaskFormatterSimpleDateFormat和这种当前方法的各种组合,但MaskFormatter成功。 我注意到Joda Time的几种参考最适合确定经过时间。 我还没有尝试过,但是本周要计划。 那六秒钟……为什么? 我感谢所有见解。

您的代码假定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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM