Som*_*Guy 3 java precision time garbage-collection date
我需要尽可能少的垃圾收集(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
Run Code Online (Sandbox Code Playgroud)
我不确定为什么我认为System.currentTimeMillis()和new Date().getTime()不同但事实证明它们是相同的.但遗憾的是,这并没有解决我的问题.
此外,getNano()从java.time.Instant似乎只有毫秒分辨率.
Instant.nowJava 9带来了一种全新的实现,Clock能够以比Java 8的毫秒级精度更精确的精度捕获当前时刻Clock.
Instant instant = Instant.now() ;
Run Code Online (Sandbox Code Playgroud)
让我说清楚:所有 Java版本中的Instant类都能够以纳秒为单位保存一个值.但是捕获当前时刻仅限于版本8中的毫秒.
您应该研究当前计算机设备的硬件时钟功能.我相信你会发现当前的传统硬件无法准确跟踪纳秒时间.
在macOS Sierra上使用Oracle JDK 9.0.4时,我看到当前时刻以微秒为单位,小数点后六位数.
System.nanoTime()不是准确的时间来源
不,准确性不是问题.那里的问题System.nanoTime()是用于跟踪已用时间,而不是当前日期时间.此功能仅跟踪自任意未记录的起始点以来的纳秒计数.
而且,如上所述,我们不是在谈论增加单纳秒,因为当前的传统计算机硬件不具备.
该java.time框架是建立在Java 8和更高版本.这些类取代麻烦的老传统日期时间类,如java.util.Date,Calendar,和SimpleDateFormat.
现在处于维护模式的Joda-Time项目建议迁移到java.time类.
要了解更多信息,请参阅Oracle教程.并搜索Stack Overflow以获取许多示例和解释.规范是JSR 310.
您可以直接与数据库交换java.time对象.使用符合JDBC 4.2或更高版本的JDBC驱动程序.不需要字符串,不需要课程.java.sql.*
从哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time.该项目是未来可能添加到java.time的试验场.您可以在此比如找到一些有用的类Interval,YearWeek,YearQuarter,和更多.