Java - 创建内部时钟

时间:2012-05-29 01:01:34

标签: java time clock internal

我希望计算从Java中特定时间开始的毫秒数。

使用System.currentTimeMillis();作为开始时间的经典方式,然后再使用前一个来获取已用时间。我希望做类似的事情,但不要依赖系统时间。

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

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

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

这样可行,但是如果计算机滞后然后锁定一两秒,我就不太可靠了。

任何想法?

1 个答案:

答案 0 :(得分:6)

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

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

来自文档

  

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

     

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

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

你可以使用Java的Timer类以某种特定的精度产生“检查”回调,比方说每500ms。此回调不会用于确定500毫秒实际上已通过。您可以在回调中调用System.nanoTime,并将其与您上次调用System.nanoTime的时间进行比较。无论挂钟如何变化,这都可以准确地表示已经过去的时间。

您可以在此处查看:System.currentTimeMillis vs System.nanoTime