【问题标题】:Java - Creating an Internal ClockJava - 创建内部时钟
【发布时间】:2012-06-03 06:02:53
【问题描述】:

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

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

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

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

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

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

有什么想法吗?

【问题讨论】:

  • 我可以问为什么有人更改系统时钟会很重要吗?
  • @JosephShanak 他刚才说了,是因为app安全问题。

标签: java time clock internal


【解决方案1】:

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

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

来自文档

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

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

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

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

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

【讨论】:

  • 这似乎很合适。我可能会问它是如何获得其价值的?
  • 我当然希望 292 年不是 263 纳秒,如果是的话,我比我想象的要老很多。
  • @JavaCoder-1337:它的意思是 2^63 纳秒(不是 263)。上标格式丢失。
  • @GregKopff 谢谢你的澄清。
猜你喜欢
  • 2017-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多