我正在用 Java 编写一个简单的计时器。它有“开始”和“停止”按钮,以及一个文本视图,显示自计时器启动以来已经过去了多少时间。
它是通过使用
System.currentTimeMillis()
设置初始时间并循环每秒更新当前值来实现的。
问题是,如果我在计时器运行时更改系统时间,整个测量就会失败。例如,如果我将时间调回一个月,计时器会显示负值,因为
currentTimeMillis()
现在返回的值小于初始值。
那么,如何计算独立于系统时间的时间增量?使这个解决方案跨平台也很棒。
System.nanoTime()
。
long start = System.nanoTime() ;
这应该可以。它不考虑系统时间,只能用于测量经过的时间。这就是你想要的。您需要除以 100 万才能得到经过的毫秒数。
Duration
来表示经过的纳秒。
Duration duration = Duration.ofNanos( start , System.nanoTime() ) ;
你可以安装像NTP这样的demon,系统时间在任何方向上跳跃都有很多问题,并且会导致很多其他问题。
System.nanoTime()
不一定取决于系统时钟 - 但它可以 - 只需确保系统时间正确进行即可。
修改系统时间是一项特权操作,因此有人这样做他们应该更了解。
这是关于同一案例的 13 年前的错误:https://bugs.java.com/bugdatabase/view_bug?bug_id=4290274
HTH