System.currentTimeMillis(),new Date()。getTime()和Calendar.getInstance()。getTimeInMillis()的准确性?

时间:2012-08-28 11:28:15

标签: java date calendar

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

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 个答案:

答案 0 :(得分:6)

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

  

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

     

此方法只能用于衡量已用时间,而不是   与系统或挂钟时间的任何其他概念有关。价值   返回表示自固定但任意时间以来的纳秒   (也许在未来,所以价值观可能是负面的)。这种方法   提供纳秒级精度,但不一定是纳秒级   准确性。不保证值的变化频率。   连续调用的差异大于约   292年(2 63 纳秒)将无法准确计算经过的时间   由于数字溢出。

答案 1 :(得分:4)

如果您想参考特定时间点,您绝对可以依赖System.currentTimeInMillis()。您描述的三种方法将以相同的方式标记时间,区别在于它所包含的对象类型。使用程序中所需的变体。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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