在Instant
有方法:
toEpochMilli
将此瞬间转换为1970-01-01T00:00:00Z时代的毫秒数getEpochSecond
从1970-01-01T00:00:00Z的Java纪元获得秒数。这两种方法都失去了精度,例如在toEpochMilli
JavaDoc我看到:
如果此瞬间具有大于毫秒的精度,则转换将丢弃任何多余的精度信息,就好像以纳秒为单位的整数除以一百万。
我没有看到相应的方法来获得更精确的时间戳。如何从Java 8中获取epoch中的微数或纳米数?
作为java.time的一部分,java.time.temporal.ChronoUnit下有一些单元,可用于将两个时间点之间的差异作为几乎任何单位的数字。例如
import java.time.Instant;
import java.time.temporal.ChronoUnit;
ChronoUnit.MICROS.between(Instant.EPOCH, Instant.now())
给出了因为Instant的纪元以来的微秒。
将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)))