将即时转换为纪元时间的微秒

2022-09-02 19:30:42

有以下几种方法:Instant

  • 到EpochMilli,将此瞬间转换为1970-01-01T00:00:00Z纪元的毫秒数
  • getEpochSecond,它从 Java 时代的 1970-01-01T00:00:00Z 获取秒数

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

如果此瞬时的精度大于毫秒,则转换会丢弃任何多余的精度信息,就好像以纳秒为单位的量被整数除以一百万一样。

我没有看到相应的方法来获得更精确的时间戳。如何在Java 8中获取epoch中的micros或nanos的数量?


答案 1

与 一起使用。getNano()getEpochSeconds()

int getNano()

获取从秒开始沿时间线的纳秒数。纳秒秒值测量 从 返回的第二个纳秒的总数。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());

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

// 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)))

答案 2

作为java.time的一部分,java.time.temporal.ChronoUnit下有一些单位,它们对于将两个时间点之间的差异作为数字在几乎任何单位中都很有用。例如:

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

ChronoUnit.MICROS.between(Instant.EPOCH, Instant.now())

给出自纪元以来该瞬间的微秒作为长。