Java中的纳秒时间,不使用java.util.Date

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似乎只有毫秒分辨率.

Bas*_*que 5

Instant.now

Java 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.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,和更多.