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

问题描述 投票:9回答:2

Instant有方法:

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

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

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

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

java datetime java-8 epoch java-time
2个回答
7
投票

作为java.time的一部分,java.time.temporal.ChronoUnit下有一些单元,可用于将两个时间点之间的差异作为几乎任何单位的数字。例如

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

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

给出了因为Instant的纪元以来的微秒。


15
投票

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)))
© www.soinside.com 2019 - 2024. All rights reserved.