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

时间:2017-12-18 13:34:29

标签: java datetime java-8 epoch java-time

toEpochMilli中有方法:

  • toEpochMilli 将此瞬间转换为1970-01-01T00:00:00Z
  • 纪元的毫秒数
  • getEpochSecond 获取1970-01-01T00:00:00Z 的Java纪元的秒数​​。

这两种方法都失去了精确度,例如在{{1}} JavaDoc我看到:

  

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

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

3 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:4)

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

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

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

将距该时间点的时间间隔定为微秒。

答案 2 :(得分:1)

尝试使用Google Guava:Instants.toEpochMicros(即时)