有谁知道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()似乎只有毫秒级的分辨率.
解决方法
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 API,带有捆绑实现.
> Java 9增加了一些小功能和修复.
>大部分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
,YearQuarter
和more.