web-dev-qa-db-fra.com

Conversion instantanée en microsecondes du temps de l'époque

Dans Instant, il existe des méthodes:

  • toEpochMilli qui convertit cet instant en nombre de millisecondes depuis l'époque du 1970-01-01T00: 00: 00Z
  • getEpochSecond qui obtient le nombre de secondes de Java Époque du 1970-01-01T00: 00: 00Z =.

Ces deux méthodes perdent en précision, par exemple dans toEpochMilli JavaDoc je vois:

Si cet instant a une précision supérieure à la milliseconde, la conversion supprime toute information de précision excessive comme si la quantité en nanosecondes était sujette à une division entière d'un million.

Je ne vois pas de méthodes correspondantes pour obtenir un horodatage plus précis. Comment puis-je obtenir le nombre de micros ou nanos d'Epoch en Java 8?

11
Michal Kordas

Dans le cadre de Java.time, il existe des unités sous Java.time.temporal.ChronoUnit qui sont utiles pour obtenir la différence entre deux points dans le temps sous forme de nombre dans presque toutes les unités de votre choix. par exemple.

import Java.time.Instant;
import Java.time.temporal.ChronoUnit;

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

donne les microsecondes depuis Epoch pour cet instant aussi longtemps.

10
pdxleif

Utilisez getNano() avec getEpochSeconds().

int getNano()

Obtient le nombre de nanosecondes, plus tard le long de la ligne de temps, depuis le début de la seconde. La valeur en nanosecondes de seconde mesure le nombre total de nanosecondes à partir de la seconde renvoyée par getEpochSecond.

Convertissez l'unité souhaitée avec TimeUnit, comme le commentaire le suggère:

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

Vous pouvez également savoir quand ils débordent:

// 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)))
15
xiaofeng.li