Java 将System.currentTimeMillis()简单地替换为Clock.systemDefaultZone().millis()安全吗?
Java8引入了接口,它应该允许我有效地模拟系统时调用(棒极了!)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
我想天真地将对
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()
,所以目前应该没有区别。