Java中的时间跟踪:使用currentTimeMills()

Java中的时间跟踪:使用currentTimeMills(),java,time,Java,Time,我今天遇到了一个有趣的“时间旅行”问题,使用以下代码: for (int i = 0; i < 1; i++){ long start = System.currentTimeMillis(); // Some code here System.out.print(i + "\t" + (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); // Some

我今天遇到了一个有趣的“时间旅行”问题,使用以下代码:

for (int i = 0; i < 1; i++){
    long start = System.currentTimeMillis();
    // Some code here
    System.out.print(i + "\t" + (System.currentTimeMillis() - start));
    start = System.currentTimeMillis();
    // Some code here
    System.out.println("\t" + (System.currentTimeMillis() - start));
}
而且它似乎是不可重复的。有人对运行期间发生的事情有任何线索吗?只是好奇

新编辑:我用一个小测试来确认下面的答案。我运行程序并在运行期间更改系统时间,最后重复“时间旅行”:

案件结案。谢谢大家


更多的话:currentTimeMillis()和nanoTime()都是基于系统计时器的,因此如果系统计时器被更新(特别是被调回),它们将不会是单调的。对于这种情况,最好使用一些基于互联网的计时器

我回忆起一些事情,比如偶尔对系统时间进行的时间调整与实际时间太匹配。由于currentTimeMillis依赖于可能发生的系统时钟。另外,您正在与时间服务器同步,这也可能是

系统。currentTimeMillis()
取决于系统时间。所以它可以被第三方系统修改


测量时间的方法是
System.nanoTime()
更好的选择。

不确定
currentTimeMillis
是否单调。使用专门为测量间隔而设计的
System.nanoTime()
,您可能会获得更好的结果。@asksw0rder:您能再次运行相同的程序并更新第二次输出吗?@asksw0rder变量i是什么?它的价值是什么?在第一个输出中获取0是没有意义的。可能的重复项:[如何在Java中测量经过的时间?][1][1]:是否使用某种网络时间同步来保持计算机时间最新?我猜这可能是由于系统时钟中的同步校正“漂移”造成的。对于这种情况,nanoTime()也不适合。使用基于互联网的时间更好。我没有说这是最好的选择,只是比
系统更好。currentTimeMillis()
。。在互联网上测量纳秒是很棘手的。
0   15  -606
0   -3563323    163