我们正在努力获得具有9个精度值的精确nanoSeconds以捕获时间。
使用Java 8,我们可以实现如下所述。
@Test
public void testNanoClock() throws InterruptedException{
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendInstant(9).toFormatter();
for (int i=0; i<10; i++) {
final Clock clock = new NanoClock();
log.info(formatter.format(clock.instant()));
Thread.sleep(200);
}
}
覆盖instant
方法如下
@Override
public Instant instant() {
return initialInstant.plusNanos(getSystemNanos() - initialNanos);
}
以下是完整的课程实施。
public class NanoClock extends Clock {
private final Clock clock;
private final long initialNanos;
private final Instant initialInstant;
public NanoClock() {
this(Clock.systemUTC());
}
public NanoClock(final Clock clock) {
this.clock = clock;
initialInstant = clock.instant();
initialNanos = getSystemNanos();
}
@Override
public ZoneId getZone() {
return clock.getZone();
}
@Override
public Clock withZone(ZoneId zone) {
return new NanoClock(clock.withZone(zone));
}
@Override
public Instant instant() {
return initialInstant.plusNanos(getSystemNanos() - initialNanos);
}
private long getSystemNanos() {
return System.nanoTime();
}
}
通过使用上面的代码,我们能够以9精度值实现纳秒时间:
2017-10-08T16:45:45.232000378Z
但在这种情况下,微秒将为0(零)。
如何在没有0(零)的情况下实现精确的纳秒时间以及9个精度值?怎么锻炼?
答案 0 :(得分:4)
您的代码在循环中创建NanoClock
的新实例。这会每次重置initialInstant
和initialNanos
,因此您永远无法看到纳米的效果。要完成这项工作,您需要将时钟移出循环,可能是静态常量。
您还应该注意,随着时间的推移,此时钟可能会偏离实时,因为System.currentTimeMillis()
和System.nanoTime()
来自操作系统中的不同时钟源,并且用于不同目的(前者是日历日期/墙上时间,后者是已用时间)。因此,您实际上是在测量自创建时钟以来经过的时间(在一天中,两者之间可能存在偏差)。