Java - System.currentTimeMillis(); 不返回差异

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函数来展示我正在调用它。


1
并且你正在从静态上下文中引用非静态上下文。因此,还有另一个编译问题。我明白“Main”只是为了演示,但请尝试在这里提供可工作的代码,以便那些想要帮助你的人更容易理解 :) - Joe M
旁注,Main?这是有意为之还是打错了? - Rosdi Kasim
主线上的周末!我为我的懒惰道歉。 - user1513909
你可能真的需要检查一下你的代码是否正确。我相信你现在发布的那段代码不能直接执行。 - Sujay
能否展示一下您是如何调用getCountdownLeft()的?也许调用代码中存在一些错误。此外,您可以尝试在函数中记录“now”和“initialTime”以进行调试。 - Alvin
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();
    }
}

由于system.currentTimeMillis在我使用它时总是“当前”时间,那么它不会大于0吗? - user1513909
每次运行程序时,您都会设置一个新的当前游戏时间,然后立即调用 getCountdownLeft(gameTime)。大约经过的时间为0。 - irrelephant
同意@irrelephant的观点。方法调用之间的时间差为零,因此您看不到任何区别。 - Sujay
抱歉,gameTime 需要被初始化为全局变量 - 已编辑。 - user1513909

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));
}

这实际上是一个回调函数,每4秒钟回调一次,我认为出于某种原因我会省略它。 - user1513909

0

嘿,我刚刚为prev、new和elapsed变量添加了打印语句。这些值是:

上一个时间 1343882409054

当前时间 1343882409054

经过的时间 0

时间为3600

因此,你的millisLeft将始终为3600。

但是,如果你尝试使用

System.nanoTime()

数值如下:

上次时间 519222175869357

当前时间 519222175923421

经过时间 54064

时间为 3545

所以在这里你需要更加细致,并考虑使用System.nanoTime()。


答案已发布。感谢您的关注。 - user1513909

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接