1

System.currentTimeMillis()当我注意到以下段落出现在其 Javadoc 中时,我正要在 Eclipse 中使用:

Returns the current system time in milliseconds since January 1, 1970
00:00:00 UTC. This method shouldn't be used for measuring timeouts or
other elapsed time measurements, as changing the system time can affect
the results.

所以这意味着我不能依赖System.currentTimeMillis()我是否想专门维护对这个当前时间点的引用。那么,最准确的方法是什么?这三种方法标记当前时间是否彼此不同?

更新:我想做的是测量两个单独程序运行中两个时间点之间的差异。我担心的是,如果我System.currentTimeMillis()在第一次运行后使用并且用户使用系统时间,我可能会在第二次运行时得到一个奇怪的意外值。

4

4 回答 4

6

您应该使用System.nanoTime()API 文档中的 , :

返回最精确的可用系统计时器的当前值,以纳秒为单位。

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示自某个固定但任意时间以来的纳秒(可能在将来,因此值可能为负数)。此方法提供纳秒精度,但不一定提供纳秒精度。不保证值的变化频率。由于数值溢出,超过大约 292 年(2 63纳秒)的连续调用的差异将无法准确计算经过的时间。

于 2012-08-28T11:33:11.580 回答
4

如果你想参考一个特定的时间点,你绝对可以依靠System.currentTimeInMillis(). 您描述的三种方法将以相同的方式标记时间,不同之处在于它包装在哪种对象中。在程序中使用您需要的变体。

如果要在程序运行期间测量两个时间点之间的差异,请 System.nanoTime()改用。

要在两个单独的程序运行中获得两个时间点之间的时间差,如果您担心用户可能会玩弄系统时钟,您将不得不依赖外部时间源。例如,您可以查看Java SNTP Client.

于 2012-08-28T11:33:14.830 回答
0

使用 System.nanoTime() 而不是 System.currentTimeInMillis()

于 2012-08-28T11:34:05.037 回答
0

的一个特点System.currentTimeMillis()是它会定期进行校正,以使其从长远来看更准确。这可能意味着时间在更正后会倒退或向前跳跃。

的一个特点System.nanoTime()是单调递增。不能保证它在 JVM 之间是相关的,但在许多系统上,它恰好是自上次处理器重置以来的时间。即它将在重新启动时重置。

于 2012-08-28T12:07:15.970 回答