web-dev-qa-db-fra.com

Comment obtenir des millisecondes à partir de LocalDateTime dans Java 8

Je me demande s’il existe un moyen d’obtenir les millisecondes actuelles depuis le 1-1-1970 (Epoch) en utilisant les nouvelles LocalDate, LocalTime ou LocalDateTime classes de Java 8.

La manière connue est ci-dessous:

long currentMilliseconds = new Date().getTime();

ou

long currentMilliseconds = System.currentTimeMillis();
226

Je ne suis pas tout à fait sûr de ce que vous entendez par "millisecondes actuelles", mais je suppose que c'est le nombre de millisecondes depuis "l’époque", à savoir minuit, le 1er janvier 1970 UTC.

Si vous voulez trouver le nombre de millisecondes depuis l’époque en ce moment, , utilisez System.currentTimeMillis() as Anubian Noob a fait remarquer . Si tel est le cas, il n'y a aucune raison d'utiliser l'une des nouvelles API Java.time pour le faire.

Cependant, vous avez peut-être déjà un objet LocalDateTime ou similaire de quelque part et vous souhaitez le convertir en millisecondes depuis l'époque. Ce n’est pas possible de le faire directement, car la famille d’objets LocalDateTime n’a aucune idée du fuseau horaire dans lequel ils se trouvent. Il faut donc fournir des informations sur le fuseau horaire pour trouver l’heure relative à l’époque, qui est en UTC.

Supposons que vous ayez un LocalDateTime comme ceci:

LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);

Vous devez appliquer les informations de fuseau horaire en donnant un ZonedDateTime. Je suis dans le même fuseau horaire que Los Angeles, alors je ferais quelque chose comme ceci:

ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles"));

Bien entendu, cela suppose des hypothèses sur le fuseau horaire. Et il peut arriver que des cas se produisent, par exemple, s'il est l'heure locale de nommer une heure proche de la transition de l'heure d'été (heure d'été). Laissons ces choses de côté, mais sachez que ces cas existent.

Quoi qu'il en soit, si vous pouvez obtenir un ZonedDateTime valide, vous pouvez le convertir en nombre de millisecondes depuis l'époque, comme suit:

long millis = zdt.toInstant().toEpochMilli();
279
Stuart Marks

Ce que je fais pour que je ne spécifie pas de fuseau horaire,

System.out.println("ldt " + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm " + System.currentTimeMillis());

donne

ldt 1424812121078 
ctm 1424812121281

Juste au cas où vous n'aimeriez pas System.current ...., utilisez Instant.now().toEpochMilli()

69
brian

Pour éviter ZoneId, vous pouvez faire:

LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);

System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());

Obtenir 0 comme valeur, c'est vrai!

17
Dani

Depuis Java 8, vous pouvez appeler Java.time.Instant.toEpochMilli().

Par exemple l'appel

final long currentTimeJava8 = Instant.now().toEpochMilli();

vous donne les mêmes résultats que

final long currentTimeJava1 = System.currentTimeMillis();
11
Marteng

Vous pouvez utiliser Java.sql.Timestamp également pour obtenir des millisecondes.

LocalDateTime now = LocalDateTime.now();
long milliSeconds = Timestamp.valueOf(now).getTime();
System.out.println("MilliSeconds: "+milliSeconds);
8
Nalam

Pour obtenir l'heure actuelle en millisecondes (depuis l'époque), utilisez System.currentTimeMillis().

8
Anubian Noob

Si vous avez une horloge Java 8, vous pouvez utiliser clock.millis() (bien qu'il vous recommande d'utiliser clock.instant() pour obtenir un Java 8 Instant, car il s'agit davantage précis).

Pourquoi utiliseriez-vous une horloge Java 8? Donc, dans votre cadre de DI, vous pouvez créer un bean Clock:

@Bean
public Clock getClock() {
    return Clock.systemUTC();
}

et ensuite dans vos tests, vous pouvez facilement vous en moquer:

@MockBean private Clock clock;

ou vous pouvez avoir un haricot différent:

@Bean
public Clock getClock() {
    return Clock.fixed(instant, zone);
}

ce qui aide avec des tests qui affirment des dates et des heures incommensurables.

2
JeeBee
  default LocalDateTime getDateFromLong(long timestamp) {
    try {
        return LocalDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneOffset.UTC);
    } catch (DateTimeException tdException) {
      //  throw new 
    }
}

default Long getLongFromDateTime(LocalDateTime dateTime) {
    return dateTime.atOffset(ZoneOffset.UTC).toInstant().toEpochMilli();
}
0
Mohamed.Abdo