虽然缺省的 Java8 时钟不提供纳秒分辨率,但您可以将其与 Java 功能结合使用,以纳秒分辨率测量时差,从而创建一个实际的纳秒级时钟。
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 Instant instant()
{
return initialInstant.plusNanos(getSystemNanos() - initialNanos);
}
@Override
public Clock withZone(final ZoneId zone)
{
return new NanoClock(clock.withZone(zone));
}
private long getSystemNanos()
{
return System.nanoTime();
}
}
使用它很简单:只需向Instant.now()提供额外的参数,或直接调用Clock.instant():
final Clock clock = new NanoClock();
final Instant instant = Instant.now(clock);
System.out.println(instant);
System.out.println(instant.getNano());
尽管即使您每次都重新创建 NanoClock 实例,此解决方案也可能有效,但最好始终坚持在代码早期初始化存储时钟,然后在需要的地方使用。