Java 如何独立于系统时间获取时间增量?

Java 如何独立于系统时间获取时间增量?,java,time,Java,Time,我正在用Java编写一个简单的计时器。它有开始和停止按钮,以及一个文本视图,显示自计时器启动以来经过了多少时间 它是通过使用System.currentTimeMillis()设置初始时间并在循环中每秒更新当前值来实现的 问题是,如果我在计时器运行时更改系统时间,整个测量将失败。例如,如果我将时间设置回一个月,计时器显示负值为currentTimeMillis()现在返回的值小于初始值 那么,如何计算独立于系统时间的时间增量呢?使此解决方案跨平台也很好。使用时间web服务。例如或使用: Syst

我正在用Java编写一个简单的计时器。它有开始和停止按钮,以及一个文本视图,显示自计时器启动以来经过了多少时间

它是通过使用
System.currentTimeMillis()
设置初始时间并在循环中每秒更新当前值来实现的

问题是,如果我在计时器运行时更改系统时间,整个测量将失败。例如,如果我将时间设置回一个月,计时器显示负值为
currentTimeMillis()
现在返回的值小于初始值


那么,如何计算独立于系统时间的时间增量呢?使此解决方案跨平台也很好。

使用时间web服务。例如或使用:

System.nanoTime()
这应该可以做到。它不考虑系统时间,只能用于测量经过的时间。这就是你想要的。您需要除以一百万才能得到经过的毫秒数。另请参见Javadocs

System.nanoTime();
发件人:

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关


你可以安装像恶魔一样的NTP,任何方向的系统时间跳跃都有很多问题,并且会导致很多其他问题

System.nanoTime()
不一定取决于系统时钟,但它可以确保系统时间正确进行。 修改系统时间是一项特权操作,因此有人这样做是为了让他们更清楚

下面是一个13岁的bug,它与同一个案例有关:


HTH

请发布您尝试过的代码。唯一的问题是您必须处理网络延迟,但这是处理此类问题的一个很好的解决方案。它不考虑系统时间,通常是这样,因为TSC实际上不可靠。看看David Holmes(高级JVM工程师,也是RT java的幕后推手)的博客:Cliff Click's(最初的hotspot架构师也一直使用currentTimeMillis,比nanoTime便宜得多)。当引入nanoTime时,它考虑到了TSC寄存器,但它在插座之间或在节能模式下并不一致。RFE:这并不意味着nanoTime与系统时钟没有链接。