有什么简单/易用的方法使用Java访问系统时钟,以便我可以计算事件的经过时间吗?
我建议不要使用 System.currentTimeMillis()
来衡量经过的时间。currentTimeMillis()
返回 '挂钟' 时间,这可能会更改(例如:夏令时,管理员用户更改时间),从而影响您的间隔测量。
另一方面,System.nanoTime()
返回自某个参考点(例如 JVM 启动)以来的纳秒数,因此不会受到系统时钟更改的影响。
这是一些示例代码。
long startTime = System.currentTimeMillis();
// Run some code;
long stopTime = System.currentTimeMillis();
System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds.");
Apache Commons-Lang还有适合您目的的StopWatch类。它使用System.currentTimeMillis(),因此仍然存在分辨率问题,但您可以暂停并进行圈数计时等操作。我现在将其作为事件统计的标准。
http://commons.apache.org/lang/api-release/org/apache/commons/lang/time/StopWatch.html
Leigh的回答是正确的。
Instant
是UTC时间轴上的一个瞬间,具有纳秒分辨率(最多9个小数位)。now
方法获取当前日期时间瞬间。Instant now = Instant.now();
你可以将一对2016-03-12T04:29:39.123Z
Instant
对象之间的经过时间计算为Duration
。该持续时间使用纳秒分辨率,最大值为long型可以容纳的秒数。这比当前宇宙估计年龄还要大。Duration duration = Duration.between( startInstant , stopInstant );
Duration::toString
的默认输出格式为标准的 ISO 8601 格式。您还可以请求纳秒总数 (toNanos
) 或毫秒总数 (toMillis
),以及其他数量。
Clock
实现使用System.currentTimeMillis()
)。
在Java 9及更高版本中,默认的Clock
实现可以以纳秒分辨率确定当前时刻。实际上,这取决于计算机时钟硬件的精度。
有关更多信息,请参见此OpenJDK问题页面:增加java.time.Clock.systemUTC()实现的精度
如果您的目的是进行基准测试,请确保查看其他问题,例如:
有可用的框架可协助进行短期基准测试。
java.lang.System.currentTimeMillis()
或 java.lang.System.nanoTime()
可以用来测量经过的时间。
public class StopWatch {
// Constructor
public StopWatch() {
}
// Public API
public void start() {
if (!_isRunning) {
_startTime = System.nanoTime();
_isRunning = true;
}
}
public void stop() {
if (_isRunning) {
_elapsedTime += System.nanoTime() - _startTime;
_isRunning = false;
}
}
public void reset() {
_elapsedTime = 0;
if (_isRunning) {
_startTime = System.nanoTime();
}
}
public boolean isRunning() {
return _isRunning;
}
public long getElapsedTimeNanos() {
if (_isRunning) {
return System.nanoTime() - _startTime;
}
return _elapsedTime;
}
public long getElapsedTimeMillis() {
return getElapsedTimeNanos() / 1000000L;
}
// Private Members
private boolean _isRunning = false;
private long _startTime = 0;
private long _elapsedTime = 0;
}