Convert Instant to microseconds from Epoch time

14,569

Solution 1

As part of java.time, there are units under java.time.temporal.ChronoUnit that are useful for getting the difference between two points in time as a number in nearly any unit you please. e.g.

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

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

gives the microseconds since epoch for that Instant as a long.

Solution 2

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

Solution 3

Try Google Guava: Instants.toEpochMicros(instant)

Share:
14,569
Michal Kordas
Author by

Michal Kordas

I believe that being a truly good QA means being first of all software developer that is capable of delivering production-quality code with additional quality-related skills. I'm passionate about Java, Groovy, JVM and fancy tools that help to test code in smart, fluent and expressive way. I'm Agile and Scrum evangelist and my main area of interest is Agile Testing. I love bringing feedback loops to the micro-level. I practice test-driven development, evolutionary design, analysis brought to minimal cycle, acceptance test-driven development, three agile amigos, being business-centric to deliver solutions based on outside-in behavior-driven development technique which are continuously deployed to satisfy client as soon and as often as possible.

Updated on June 03, 2022

Comments

  • Michal Kordas
    Michal Kordas about 2 years

    In Instant there are methods:

    • toEpochMilli which converts this instant to the number of milliseconds from the epoch of 1970-01-01T00:00:00Z
    • getEpochSecond 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?