[英]Nanosecond Time in Java Without Using 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()
和new Date().getTime()
是不同的但事实证明它们是相同的。 但遗憾的是,这并没有解决我的问题。
此外, getNano()
从java.time.Instant
似乎只有毫秒。
Instant.now
Java 9带来了全新的Clock
实现,能够以比Java 8 Clock
的毫秒级能力更精确的精度捕获当前时刻。
Instant instant = Instant.now() ;
让我说清楚: 所有 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-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
System.nanoTime()不是准确的时间来源
这不是真的。 其准确性高度依赖于系统 。 如果您可以控制硬件和操作系统,那么即使在较旧的Java版本上,您也可以从中构建高精度时钟。
自JDK-8068730实施以来,较新的时间API通过推迟最精确的OS时钟来保护您免受这些复杂性的影响,而后者将进行必要的硬件特征检测,以确定TSC是否足够可靠以便用作时间资源。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.