Java中的纳秒时间,不使用java.util.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

编辑:

我不确定为什么我认为System.currentTimeMillis()和新的Date().getTime()是不同的但事实证明它们是相同的.但遗憾的是,这并没有解决我的问题.

此外,java.time.Instant中的getNano()似乎只有毫秒级的分辨率.

解决方法

Instant.Now

Java 9带来了全新的Clock实现,能够以比Java 8 Clock的milliseconds功能更精细的方式捕获当前时刻.

Instant instant = Instant.Now() ;

让我说清楚:所有版本的Java中的Instant类都能够在nanoseconds中保存一个值.但是捕获当前时刻仅限于版本8中的毫秒.

您应该研究当前计算机设备的硬件时钟功能.我相信你会发现当前的传统硬件无法准确跟踪纳秒时间.

在macOS Sierra上使用Oracle JDK 9.0.4时,我看到当前时刻在microseconds中捕获,小数点后六位数.

System.nanoTime() isn’t an accurate source of time

不,准确性不是问题.问题在于System.nanoTime()旨在跟踪已用时间,而不是当前日期时间.此功能仅跟踪自任意未记录的起始点以来的纳秒计数.

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

关于java.time

java.time框架内置于Java 8及更高版本中.这些课程取代了麻烦的旧legacy日期时间课程,如java.util.Date,Calendar和& SimpleDateFormat.

Joda-Time项目现在是maintenance mode,建议迁移到java.time课程.

要了解更多信息,请参阅Oracle Tutorial.并搜索Stack Overflow以获取许多示例和说明.规格是JSR 310.

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

从哪里获取java.time类?

> Java SE 8,Java SE 9及更高版本

>内置.
>部分标准Java API,带有捆绑实现.
> Java 9增加了一些小功能和修复.

> Java SE 6Java SE 7

>大部分java.time功能都被反向移植到Java 6& 7月在ThreeTen-Backport.

> Android

>更新版本的Android捆绑java.time类的实现.
>对于早期的Android(< 26),ThreeTenABP项目采用ThreeTen-Backport(如上所述).见How to use ThreeTenABP….

ThreeTen-Extra项目使用其他类扩展了java.time.该项目是未来可能添加到java.time的试验场.您可以在这里找到一些有用的类,例如Interval,YearWeek,YearQuartermore.

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...