In Instant
there are methods:
toEpochMilli
which converts this instant to the number of milliseconds from the epoch of 1970-01-01T00:00:00ZgetEpochSecond
which gets the number of seconds from the Java epoch of 1970-01-01T00:00:00Z.Both of these methods lose precision, e.g. in toEpochMilli
JavaDoc I see:
If this instant has greater than millisecond precision, then the conversion drop any excess precision information as though the amount in nanoseconds was subject to integer division by one million.
I don't see corresponding methods to obtain more precise timestamp. How can I get number of micros or nanos from epoch in Java 8?
Use getNano()
together with getEpochSeconds()
.
int getNano()
Gets the number of nanoseconds, later along the time-line, from the start of the second. The nanosecond-of-second value measures the total number of nanoseconds from the second returned by
getEpochSecond
.
Convert to desired unit with TimeUnit
, as the comment suggested:
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());
You can also find out when they overflow:
// 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)))