0

可能重复:
如何将毫秒转换为“hh:mm:ss”格式?

我敢打赌,很多人需要一个计时器,其中包括: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。所有变量都在类中声明为私有。

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

4

3 回答 3

5

建议:

  • 除了你的数学是关闭的,一个基本的计时器规则:永远不要相信计时器的时间间隔。而是存储初始系统时间,从当前系统时间中减去它,并将您的计算基于实时,而不是基于一些人为的计数器增量。
  • 此外,您正在使用数,并且需要避免它们。而是使用 SECONDS_PER_MINUTE 和 MINUTES_PER_HOUR 等常量,这将帮助您避免粗心的数学错误。
于 2013-01-15T23:29:48.430 回答
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;
}
于 2013-01-15T23:32:50.977 回答
0

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

    long counter = this.counter;
于 2013-01-15T23:29:44.150 回答