我正在用Java编写一个简单的计时器。它有“开始”和“停止”按钮,以及显示自计时器启动以来经过了多长时间的文本视图。
通过设置System.currentTimeMillis()
的初始时间并在循环中每秒更新当前值来实现。
问题是如果在计时器运行时更改系统时间,整个测量将失败。例如,如果我将时间设定为一个月,则计时器显示负值,因为currentTimeMillis()
现在返回的值小于初始值。
那么,我如何计算与系统时间无关的时间增量?将这个解决方案跨平台也很棒。
答案 0 :(得分:10)
使用:
System.nanoTime()
这应该这样做。它不会考虑系统时间,只能用于测量经过的时间。这是你想要的。您需要除以100万才能获得经过的毫秒数。另见Javadocs。
答案 1 :(得分:4)
答案 2 :(得分:1)
答案 3 :(得分:0)
你可以像NTP一样安装恶魔,任何方向的系统时间跳跃都有很多问题,并且可能导致很多其他问题。
System.nanoTime()
不一定依赖于系统时钟 - 但它可以 - 只是确保系统时间正确进行。
修改系统时间是一项特权操作,因此有人会这样做,他们会更好地了解。
以下是关于同一案件的13岁以下的错误:http://bugs.sun.com/view_bug.do?bug_id=4290274
HTH