编程语言
首页 > 编程语言> > 如何在Java 8中使用Date API达到精确的纳秒精度

如何在Java 8中使用Date API达到精确的纳秒精度

作者:互联网

我们正在尝试获取具有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);
       }
}

覆盖即时方法如下

@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(零).

如何获得精确的nanoSeconds时间以及9个精度值而没有0(零)?如何锻炼?

解决方法:

您的代码在循环中创建了NanoClock的新实例.这每次都会重置initialInstant和initialNanos,因此您永远不会看到nanos的效果.要使此工作完全正常,您需要将时钟移出循环,可能需要移至静态常量.

您还应该注意,随着时间的流逝,此时钟可能会偏离实时,因为System.currentTimeMillis()和System.nanoTime()源自操作系统中的不同时钟源,并且有不同的用途(前者是日历日期/挂历时间,后者是经过的时间).因此,您实际上是在测量自创建时钟以来经过的时间(在一天的过程中,两者之间可能会有一些偏差).

标签:java-8,java-time,java
来源: https://codeday.me/bug/20191025/1930140.html