[英]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: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
...
最近四天我一直在Google和论坛上浏览,试图弄清楚如何动态显示经过的时间,这是我发现的唯一可以操作的最简单的方法。 JFormattedTextField
,我已经尝试过JFormattedTextField
, MaskFormatter
, SimpleDateFormat
和这种当前方法的各种组合,但MaskFormatter
成功。 我注意到Joda Time的几种参考最适合确定经过时间。 我还没有尝试过,但是本周要计划。 那六秒钟……为什么? 我感谢所有见解。
您的代码假定ss
始终大于s
, mm
始终大于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.