从大纪元时间转换瞬间到微秒

Mic*_*das 11 java datetime epoch java-8 java-time

Instant有方法:

  • toEpochMilli将此瞬间转换为1970-01-01T00:00:00Z时代的毫秒数
  • getEpochSecond得到的从1970-01-01T00了Java时代的秒数:00:00Z.

这两种方法都失去了精度,例如在toEpochMilliJavaDoc中我看到:

如果此瞬间具有大于毫秒的精度,则转换将丢弃任何多余的精度信息,就好像以纳秒为单位的整数除以一百万.

我没有看到相应的方法来获得更精确的时间戳.如何从Java 8中获取epoch中的微数或纳米数?

xia*_*.li 15

使用getNano()一起getEpochSeconds().

int getNano()
Run Code Online (Sandbox Code Playgroud)

获取从时间线开始的第二个开始的纳秒数.纳秒秒值测量从返回的第二个纳秒的总纳秒数getEpochSecond.

转换为所需的单位TimeUnit,如评论建议:

Instant inst = Instant.now();
// Nano seconds since epoch, may overflow
long nanos = TimeUnit.SECONDS.toNanos(inst.getEpochSecond()) + inst.getNano();
// Microseconds since epoch, may overflow
long micros = TimeUnit.SECONDS.toMicros(inst.getEpochSecond()) + TimeUnit.NANOSECONDS.toMicros(inst.getNano());
Run Code Online (Sandbox Code Playgroud)

您还可以了解它们何时溢出:

// 2262-04-11T23:47:16.854775807Z
Instant.ofEpochSecond(TimeUnit.NANOSECONDS.toSeconds(Long.MAX_VALUE), 
                      Long.MAX_VALUE % TimeUnit.SECONDS.toNanos(1));
// +294247-01-10T04:00:54.775807Z
Instant.ofEpochSecond(TimeUnit.MICROSECONDS.toSeconds(Long.MAX_VALUE), 
                      TimeUnit.MICROSECONDS.toNanos(Long.MAX_VALUE % TimeUnit.SECONDS.toMicros(1)))
Run Code Online (Sandbox Code Playgroud)

  • 好答案.除了`getNano()`之外,我建议您使用`TimeUnit`来处理所涉及的转换,然后决定是否需要溢出检测.一方面,"Instant.MIN"和"Instant.MAX"的微秒将不适合"long",另一方面,"long"足以满足过去或未来的"瞬间". (2认同)

pdx*_*eif 10

作为java.time的一部分,java.time.temporal.ChronoUnit下有一些单位,这些单位可用于获取两个时间点之间的差值,几乎是您所希望的任何单位。例如

import java.time.Instant;
import java.time.temporal.ChronoUnit;

ChronoUnit.MICROS.between(Instant.EPOCH, Instant.now())
Run Code Online (Sandbox Code Playgroud)

给出自该时间点以来的毫秒数。