繁体   English   中英

System.currentTimeMillis(),新的Date()。getTime()和Calendar.getInstance()。getTimeInMillis()的精度?

[英]Accuracy of System.currentTimeMillis(), new Date().getTime(), and Calendar.getInstance().getTimeInMillis()?

当我发现以下段落出现在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()并且用户在第一次运行后使用系统时间进行播放,那么在第二次运行期间我可能会得到一个奇怪的意外值。

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

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

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

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

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

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

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

System.currentTimeMillis()一个功能是定期对其进行纠正,以使其长期运行更加准确。 这可能意味着校正后时间会倒退或向前跳。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM