功能上次呼叫后经过的时间

时间:2012-12-23 22:37:03

标签: java

我正在尝试编写一个方法,该方法将返回自上次调用该方法以来已经过去的时间,它看起来像这样:

package JGame.Util;

import java.util.Date;

public class Util{

    protected static Long lastTime = null;

    public static long getLastTime(){
        long time = new Date().getTime();
        if(Util.lastTime == null){
            Util.lastTime = time;
            return 0;
        }
        long ftime = time - Util.lastTime;
        Util.lastTime = time;
        return ftime;
    }
}

然后我在一个关键的新闻事件中调用这样的方法:

long lastTime = Util.getLastTime();
if(lastTime > 1000){
    return;
}
System.out.println(lastTime);

我遇到的问题是,当按下键时,它会打印出lastTime,但它应该每秒打印一次。

这是输出:

122
6
7
13
9
7
10
9
10

在按住键的同时,我预计所有时间都非常接近1秒。但数字甚至都不是很接近。

3 个答案:

答案 0 :(得分:5)

你的病情错了。看看这个:

if (lastTime > 1000) {
    return;
}

这就是说,如果该方法最后被称为 more 而不是一秒钟之前,请不要打印任何内容。因此,如果您连续多次调用它,它将始终在第一次之后通过此检查。

我怀疑你想想你想要

if (lastTime < 1000) {
    return;
}

...但实际上仍然无法按照自己的意愿行事 - 因为现在如果您经常按下执行该代码,那么将首次超过该检查。

如果超过一秒钟,您只需要重置“上次打印”时间

哦,我建议您使用System.nanoTime()而不是new Date().getTime() - 它保证会单调增加,并且用于测量时差而不是“当前”的墙壁时间。我还要使只使用静态变量。我创建了一个允许“阈值”的类,并且有一个方法来查看该阈值是否已经过去,如果是,则重置计时器:

public class TimeRegulator {
    private final long periodMilliseconds;

    private long lastTick = 0L; // 1970 will be long before the current time :)

    public TimeRegulator(long periodMilliseconds) {
        this.periodMilliseconds = periodMilliseconds;
    }

    public boolean checkTime() {
        long now = System.nanoTime();
        long diffNanos = now - lastTick;
        long diffMilliseconds = TimeUnit.NANOSECONDS.toMillis(diffNanos);
        if (diffMilliseconds < periodMilliseconds) {
            return false;
        }
        lastTick = now;
        return true;
    }
}

另外,考虑注入“获取当前时间”的抽象,以使所有这些都可测试......并考虑使用Joda Time而不是内置库:)

答案 1 :(得分:2)

如果最后一次通话更多超过1秒,您将返回,我认为如果 超过1秒,您应该返回。

您的代码永远不会做什么(除非更正)是打印高于1000的值。

答案 2 :(得分:2)

你的if语句被颠倒了:

if(lastTime > 1000){
    return;
}

如果最后一个间隔超过一秒,则返回,这与您所描述的相反。请尝试将其更改为if(lastTime < 1000){

否则我的代码看不出任何问题。