3

何らかの理由で、関数によって一貫した 3600 が返されます。

private static long getCountdownLeft() {
    long now = System.currentTimeMillis();
    long elapsedMillis = now - initialTime; //difference of current 'current' time
    long millisLeft = secondsOfGame * 1000 - elapsedMillis;
    return millisLeft/1000;
}

public static void Main(String[] args ) {
     System.out.println("Time is " + getCountdownLeft());
}

private static int secondsOfGame = 3600;
private static long initialTime = System.currentTimeMillis();

これはイベント駆動型です。関数を呼び出すたびに時間の違いが見られると思います。main を使用して、それを呼び出していることを示しているだけです。

4

3 に答える 3

2

これはおそらく がelapsedMillisゼロになるためです。System.nanoTime()経過時間の計算に使用することをお勧めします。

あなたのコードがどのように機能するかはよくわかりませんが (現在投稿されているように)、このようなものが機能する可能性があります。計算用のロジックを追加する必要があることに注意してください。これは単なるサンプルです。

public class TimeTest {

    private long startTime;

    public TimeTest(){
        startTime = System.nanoTime();
    }

    public void computeTimeDifference(){
        long currentTime = System.nanoTime();
        long elapsedTime = currentTime - startTime;

        System.out.println("Difference: "+elapsedTime+ "ns");
    }

    public static void main(String[] args) {
        new TimeTest().computeTimeDifference();
    }
}
于 2012-08-02T04:16:41.363 に答える
0

コードで getCountdownLeft を呼び出すまでに少し時間がかかります。このコードを更新してみてください:

    public static void Main(String[] args) throws InterruptedException {
    long gameTime = System.currentTimeMillis(); // pass the current time
    Thread.currentThread().sleep(1000); // sleep one second before invoke getCountdownLeft
    System.out.println("Time is " + getCountdownLeft(gameTime));
}
于 2012-08-02T04:17:35.717 に答える
0

ちょっと、prev、new、elapse 変数の print ステートメントを追加しました。値は次のとおりです。

前回 1343882409054

現在 1343882409054

経過時間 0

時間は 3600

したがって、 millisLeft は常に 3600 になります。

でも使ってみると

System.nanoTime()

値は、

前回 519222175869357

現在 519222175923421

経過時間 54064

時間は 3545

そのため、ここではより細かくする必要があり、System.nanoTime() の使用を検討する必要があります。

于 2012-08-02T04:39:14.837 に答える