3

我希望从 Java 中的特定时间计算经过的时间(以毫秒为单位)。

它用于开始时间的经典方式System.currentTimeMillis();,然后再次与前一个一起使用以获取经过时间。我希望做类似的事情,但不要依赖系统时间。

如果我依赖系统时间,程序的用户可以操纵系统时钟来破解程序。

我尝试使用类似于以下的代码:

int elapsed = 0;
while (true) {
    Thread.sleep(10);
    elapsed += 10;
}

这可行,但是在计算机滞后然后锁定一两秒钟的情况下,我不太可靠。

有什么想法吗?

4

1 回答 1

6

你想利用System.nanoTime. 它与系统时钟无关。它只能用于跟踪相对时间,这似乎是您想要做的。

为了防止这个答案只是指向另一个答案的链接,这里有一个简短的解释。

从文档

public static long nanoTime()返回最精确的可用系统计时器的当前值,以纳秒为单位。

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意时间以来的纳秒(可能在将来,因此值可能为负数)。此方法提供纳秒精度,但不一定提供纳秒精度。不保证值的变化频率。由于数值溢出,超过大约 292 年(2 63纳秒)的连续调用的差异将无法准确计算经过的时间。

另一个指向计时器信息的链接:https ://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks

您可以使用 Java 的 Timer 类以某种特定的精度产生一个“检查”回调,比如说每 500 毫秒。此回调不会用于确定 500 毫秒是否确实通过了。您将调用System.nanoTime回调并将其与您上次调用的时间进行比较System.nanoTime。无论挂钟如何变化,这都会为您提供相当准确的时间表示。

你可以看看这里:System.currentTimeMillis vs System.nanoTime

于 2012-05-29T01:08:18.523 回答