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

问题描述 投票:0回答:4

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

它是通过使用

System.currentTimeMillis()
设置初始时间并循环每秒更新当前值来实现的。

问题是,如果我在计时器运行时更改系统时间,整个测量就会失败。例如,如果我将时间调回一个月,计时器会显示负值,因为

currentTimeMillis()
现在返回的值小于初始值。

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

java time
4个回答
11
投票

致电

System.nanoTime()

long start = System.nanoTime() ;

这应该可以。它不考虑系统时间,只能用于测量经过的时间。这就是你想要的。您需要除以 100 万才能得到经过的毫秒数。

或者在 Java 8+ 中,使用

Duration
来表示经过的纳秒。

Duration duration = Duration.ofNanos( start , System.nanoTime() ) ;

4
投票
System.nanoTime();

来自 Javadoc

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


1
投票

使用时间网络服务。例如 thisthisthis


0
投票

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

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

这是关于同一案例的 13 年前的错误:https://bugs.java.com/bugdatabase/view_bug?bug_id=4290274

HTH

© www.soinside.com 2019 - 2024. All rights reserved.