定时器到分钟:秒:几百秒

时间:2013-01-15 23:25:35

标签: java timer

  

可能重复:
  How to convert milliseconds to “hh:mm:ss” format?

我敢打赌,很多人需要一个由minutes : seconds : hundreds of seconds组成的计时器。 显然,你从:

开始
` public TimeGame(){

    timer = new Timer(10, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            counter++;
        }
    });
    timer.start();
}`

然后你需要调用一个改变这个计数器的方法:minutes : seconds : hundreds of seconds

`private String timeTransfer(){

     minutes = counter/6000;
     counter = counter - (minutes*6000);
     seconds = counter/100 ;
     counter = counter - (seconds*100);
     milliseconds = counter;
     return minutes + " : " + seconds + " : " + miliseconds;
 }`

但我的方法中有一个错误。一旦达到100毫秒,它就会跳回到0。 通常它必须放0:1:0,但它会跳回0:0:0。 所有变量都在类中声明为私有。

所以我的问题是有人知道更好的方法吗?

3 个答案:

答案 0 :(得分:5)

建议:

  • 除了你的数学关闭,一个基本的计时器规则:不要相信计时器的时间间隔。而是存储初始系统时间,从当前系统时间中减去它,并将计算基于实时,而不是基于某些人工计数器增量。
  • 此外,您正在使用 magic 号码,需要避免使用它们。而是使用SECONDS_PER_MINUTE和MINUTES_PER_HOUR等常量来帮助您避免不小心的数学错误。

答案 1 :(得分:4)

以下是此代码的一种形式,多年来被许多人写了很多次:

private String timeTransfer(){

     minutes = counter/6000;
     seconds = (counter % 6000) /100 ;
     milliseconds = counter % 100;
     return minutes + " : " + seconds + " : " + milliseconds;
 }

另一张海报评论说,这种方式使用计时器是不准确的。如果你只是运行这个东西几分钟,错误不会加起来太多。如果您在几分钟内做得更多,则需要使用系统时间来处理此问题。

首先,在初始化计数器时存储当前时间:

long startTime = System.currentTimeMillis();

然后,您会在从timeTransfer()

返回之前的开始时间定期更新计数器
if (milliseconds < 10) {
    counter = (System.currentTimeMillis() - start) / 10;
}

答案 2 :(得分:0)

您的方法timeTransfer()修改类成员变量counter。将其复制到方法开头的局部变量并对其执行计算,例如:

    long counter = this.counter;