繁体   English   中英

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

[英]How to achieve exact nanosecond precision using Date API in Java 8

我们试图获得具有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);
       }
}

Overriden 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个精度值? 怎么锻炼?

您的代码在循环中创建了一个新的NanoClock实例。 initialNanos每次重置initialInstantinitialNanos ,因此您永远无法看到nanos的效果。 要完成这项工作,您需要将时钟移出循环,可能是静态常量。

您还应该知道,随着时间的推移,这个时钟可能会偏离实时,因为System.currentTimeMillis()System.nanoTime()是从操作系统中的不同时钟源派生的,并且用于不同的目的(前者是日历日期/墙壁时间 ,后者是经过的时间 )。 因此,您实际上是在测量自创建时钟以来经过的时间(在一天中,两者之间可能存在一些偏差)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM