我正在尝试编写一个方法,该方法将返回自上次调用该方法以来已经过去的时间,它看起来像这样:
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秒。但数字甚至都不是很接近。
答案 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){
否则我的代码看不出任何问题。