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

时间:2018-03-29 14:19:43

标签: java date time garbage-collection precision

我需要尽可能少的垃圾收集(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}}似乎只有毫秒分辨率。

2 个答案:

答案 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 旨在跟踪已过去的时间,而不是当前的日期时间。此功能仅跟踪自任意未记录的起始点以来的纳秒计数。

再次,如上所述,我们不是在谈论增加单纳秒,因为当前的传统计算机硬件不具备。

关于 java.time

microseconds框架内置于Java 8及更高版本中。这些类取代了麻烦的旧System.nanoTime()日期时间类,例如java.timelegacy和&amp; java.util.Date

现在位于CalendarSimpleDateFormat项目建议迁移到Joda-Time类。

要了解详情,请参阅maintenance mode。并搜索Stack Overflow以获取许多示例和解释。规范是java.time

您可以直接与数据库交换 java.time 对象。使用符合Oracle Tutorial或更高版本的JSR 310。不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

  • JDBC driverJDBC 4.2以及之后
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小功能和修复。
  • Java SE 8Java SE 9
    • 大部分java.time功能都被反向移植到Java 6&amp; 7 {in Java SE 6
  • Java SE 7
    • 更新版本的Android捆绑java.time类的实现。
    • 对于早期的Android(&lt; 26),ThreeTen-Backport项目会调整 ThreeTen-Backport (如上所述)。见Android

ThreeTenABP项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如How to use ThreeTenABP…ThreeTen-ExtraIntervalYearWeek

答案 1 :(得分:1)

  

System.nanoTime()不是准确的时间来源

这不是真的。其准确度为highly system-dependent。如果您可以控制硬件和操作系统,那么即使在较旧的Java版本上,您也可以从中构建高精度时钟。

JDK-8068730实施以来,较新的时间API通过推迟到最准确的OS时钟来保护您免受这些复杂性的影响,而后者又可以进行必要的硬件特征检测,以确定TSC是否足够可靠到用作时间源。