Java 将System.currentTimeMillis()简单地替换为Clock.systemDefaultZone().millis()安全吗?

Java 将System.currentTimeMillis()简单地替换为Clock.systemDefaultZone().millis()安全吗?,java,datetime,java-time,Java,Datetime,Java Time,Java8引入了接口,它应该允许我有效地模拟系统时调用(棒极了!) 我想天真地将对System.currentTimeMillis()的调用替换为对someClock.millis()的调用,但我不清楚这两个时钟是否会根据Clock.System*文档中给出的说明在所有情况下返回相同的值,该说明它们使用“…最佳可用系统时钟”. System.currentTimeMillis()没有指定关于使用最佳可用时钟的任何类似声明。java.time.SystemClock实现java.time.clo

Java8引入了接口,它应该允许我有效地模拟系统时调用(棒极了!)


我想天真地将对
System.currentTimeMillis()
的调用替换为对
someClock.millis()
的调用,但我不清楚这两个时钟是否会根据
Clock.System*
文档中给出的说明在所有情况下返回相同的值,该说明它们使用“…最佳可用系统时钟”.
System.currentTimeMillis()
没有指定关于使用最佳可用时钟的任何类似声明。

java.time.SystemClock
实现
java.time.clock
在其
millis()方法中调用
System.currentTimeMillis()
,所以基本上这是相同的,最终所有的实现都会从系统调用返回时间。不,你不能保证它完全相同,因为

系统工厂方法提供基于最佳可用系统时钟的时钟。这可能使用System.currentTimeMillis()或更高分辨率的时钟(如果有)

所以它明确表示它可能使用更好的时钟,这意味着它可能完全不同

即使您分析了所有现有的实现,发现它们都在使用
System.currentTimeMillis()
,也无法明确保证事情会保持这种状态,因此依赖它是无效的


对于您的目的来说,这是否足够接近,实际上取决于您的应用程序和个人偏好。

答案在于以下陈述:

。。这可能使用System.currentTimeMillis()或更高分辨率的时钟 如果有可用的


我觉得更换是安全的,以便尽可能获得更高分辨率的时钟,如
System.nanoTime()

JDK 9将具有更高精度的时钟,请参阅问题。因此,
System.currentTimeMillis()
Clock.systemUTC().millis()
可能不同。考虑到今天,在Windows上, CurrutTimeMiLIS/Cuth>返回一个低精度值,即使在毫秒级,JDK 9也几乎肯定会更好。


保证相同行为的一个选项是自己实现
Clock
类,调用
currentTimeMillis

它是
java.time.Clock.SystemClock
:),但它实际使用的是
System.currentTimeMillis()
,所以目前应该没有区别。