我想看看用户是否在一秒钟内完成了某项任务。我知道有几种方法可以让时间过去,但我想知道这种情况最准确的方法是什么。我希望从某个时间开始,时间过去了。例如,注册一个计时器,稍后再参考它:
用户做某事
我检查用户是否在一秒计时器中完成了任务
用户再做一次
我检查用户是否在之前运行的同一秒计时器内完成了任务。如果没有,请将计时器设为空。
用户再做一次
我检查用户是否在一秒计时器内完成了任务。如果没有,请将计时器设为空。
我希望基本上有一个运行一秒钟的计时器,因为用户完成了各种任务。完成每项任务后,我会检查计时器是否仍在运行。我不想使用倒数计时器,因为它不够准确一秒钟。我可以使用什么方法?
答案 0 :(得分:0)
如果您需要纳秒精度,请使用System.currentTimeMillis()
或System.nanoTime()
。我想,System.currentTimeMillis()
精度应该足以满足您的需求。
在开始任务之前记录时间戳,然后在完成任务并完成差异之后记录。
检查this answer,了解哪种方法更适合您。
答案 1 :(得分:0)
如果您想要最高的精确度,请使用System.nanoTime()。 System.currentTimeMillis()也应该适合你。
此方法提供纳秒级精度,但不一定是纳秒级分辨率(即值的变化频率) - 除了分辨率至少与currentTimeMillis()的分辨率一样好之外,不做任何保证。
只需使用这些方法之一实现一个简单的计时器。
private static final class Timer {
private long start;
private long end;
static double toSeconds(long nanos) {
return nanos / 1000000000.0;
}
void start() {
end = -1;
start = System.nanoTime();
}
double getCurrent() {
return toSeconds(System.nanoTime() - start);
}
double stop() {
end = System.nanoTime();
return toSeconds(end - start);
}
boolean isRunning() {
return end == -1;
}
}
public static void main(String[] args) {
Timer timer = new Timer();
timer.start();
doSomething();
if (timer.getCurrent() > 1.0) {
double time = timer.stop();
System.out.println("User completed task 1 in " + time);
}
doSomething();
if (timer.isRunning() && timer.getCurrent() > 1.0) {
double time = timer.stop();
System.out.println("User completed task 1 & 2 in " + time);
}
doSomething();
if (timer.isRunning() && timer.getCurrent() > 1.0) {
double time = timer.stop();
System.out.println("User completed task 1 & 2 & 3 in " + time);
}
System.out.println("All tasks finished");
}