我需要尽可能少的垃圾收集(GC),非常精确和准确的时间,理想情况下每天1次。 System.currentTimeMillis()
不够精确,System.nanoTime()
不是准确的时间来源。唯一能给我想要的东西是java.util.Date.getTime()
,但它不是静态方法所以每次我需要精确准确的时间创建一个新的Date
对象时会导致GC被更频繁地触发。
有谁知道Date
课程如何获得准确而准确的时间?我希望采用Date的方法并定制它以最小化对象创建。要总结我的问题,请参阅以下内容:
long nanosSinceEpoch;
nanosSinceEpoch = System.currentTimeMillis(); // Not precise
nanosSinceEpoch = System.nanoTime(); // Not accurate
nanosSinceEpoch = new Date().getTime(); // Too many objects
我不确定为什么我认为System.currentTimeMillis()
和new Date().getTime()
不同但事实证明它们是相同的。但这并不能解决我的问题。
此外,来自getNano()
的{{1}}似乎只有毫秒分辨率。
答案 0 :(得分:5)
Instant.now
Java 9带来了Clock
的全新实现,能够以比Java 8 Clock
的{{3}}能力更精确的精度捕获当前时刻。
Instant instant = Instant.now() ;
让我说清楚:所有版本的Java中的Instant
类能够在<{3}}中保存一个值。但捕获当前时刻特别限于版本8中的毫秒。
您应该研究当前计算机设备的硬件时钟功能。我相信你会发现当前的传统硬件无法准确跟踪纳秒时间。
在macOS Sierra上使用Oracle JDK 9.0.4时,我看到当前时刻在milliseconds中捕获,小数点后六位数。
System.nanoTime()不是准确的时间来源
不,准确性不是问题。问题是nanoseconds 旨在跟踪已过去的时间,而不是当前的日期时间。此功能仅跟踪自任意未记录的起始点以来的纳秒计数。
再次,如上所述,我们不是在谈论增加单纳秒,因为当前的传统计算机硬件不具备。
microseconds框架内置于Java 8及更高版本中。这些类取代了麻烦的旧System.nanoTime()
日期时间类,例如java.time,legacy和&amp; java.util.Date
现在位于Calendar
的SimpleDateFormat
项目建议迁移到Joda-Time类。
要了解详情,请参阅maintenance mode。并搜索Stack Overflow以获取许多示例和解释。规范是java.time。
您可以直接与数据库交换 java.time 对象。使用符合Oracle Tutorial或更高版本的JSR 310。不需要字符串,不需要java.sql.*
类。
从哪里获取java.time类?
ThreeTenABP项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如How to use ThreeTenABP…,ThreeTen-Extra,Interval
和YearWeek
。
答案 1 :(得分:1)
System.nanoTime()不是准确的时间来源
这不是真的。其准确度为highly system-dependent。如果您可以控制硬件和操作系统,那么即使在较旧的Java版本上,您也可以从中构建高精度时钟。
自JDK-8068730实施以来,较新的时间API通过推迟到最准确的OS时钟来保护您免受这些复杂性的影响,而后者又可以进行必要的硬件特征检测,以确定TSC是否足够可靠到用作时间源。