小编典典

如何在 Java 中测量经过的时间?

all

我想要这样的东西:

public class Stream
{
    public startTime;
    public endTime;

    public getDuration()
    {
        return startTime - endTime;
    }
}

同样重要的是,例如,如果 startTime 为 23:00,endTime 为 1:00,则持续时间为 2:00。

为了在 Java 中实现这一点,使用哪些类型?


阅读 82

收藏
2022-03-31

共1个答案

小编典典

不幸的是,到目前为止发布的十个答案中没有一个是完全正确的。

如果您正在测量经过的时间,并且希望它是 正确 的,则必须使用System.nanoTime().
你不能使用System.currentTimeMillis(),除非你不介意你的结果是错误的。

的目的nanoTime是测量 经过 的时间,而 的目的currentTimeMillis是测量 挂钟
时间。您不能将其中一个用于其他目的。原因是没有计算机的时钟是完美的。它总是漂移,偶尔需要纠正。这种更正可能是手动进行的,或者在大多数机器的情况下,有一个进程在运行并不断地对系统时钟(“挂钟”)进行小幅更正。这些往往会经常发生。每当有闰秒时,就会发生另一种这样的修正。

由于nanoTime的目的是测量经过的时间,因此不受任何这些小修正的影响。这是你想要使用的。目前正在进行的任何时间安排currentTimeMillis都将被取消——甚至可能是负面的。

你可能会说,“这听起来并不那么重要”,我说,也许不是,但总的来说,正确的代码不比不正确的代码更好吗?此外,nanoTime无论如何打字都更短。

以前发布的关于nanoTime通常只有微秒精度的免责声明是有效的。此外,调用可能需要超过一微秒的时间,具体取决于情况(其他情况也是如此),因此不要期望正确地计时非常非常小的时间间隔。

2022-03-31