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() は、クラス メンバー variable を変更しますcounter。メソッドの先頭にあるローカル変数にコピーし、計算を実行します。次に例を示します。

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