Конвертировать Мгновенно в микросекунды из времени эпохи

В Instant Есть методы:

  • toEpochMilli который преобразует этот момент в число миллисекунд с эпохи 1970-01-01T00:00:00Z
  • getEpochSecond который получает количество секунд из эпохи Java 1970-01-01T00:00:00Z.

Оба эти метода теряют точность, например, в toEpochMilli JavaDoc я вижу:

Если этот момент имеет точность, превышающую миллисекунду, то при преобразовании отбрасывается любая информация о избыточной точности, как если бы количество в наносекундах было целочисленным делением на миллион.

Я не вижу соответствующих методов для получения более точной метки времени. Как я могу получить количество микро или нанос из эпохи в Java 8?

1 ответ

Использование 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)))

Как часть java.time, в java.time.temporal.ChronoUnit есть единицы, которые полезны для получения разницы между двумя точками во времени как числа практически в любой единице, которую вы пожелаете. например

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

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

дает микросекунды с эпохи для этого Мгновенного как долго.

Попробуйте Google Guava: Instants.toEpochMicros(мгновенно)

Другие вопросы по тегам