web-dev-qa-db-fra.com

Comment créer une date locale Java 8 à partir d'une longue époque en millisecondes?

J'ai une API externe qui me renvoie les dates sous la forme longs, exprimées en millisecondes depuis Epoch.

Avec l'ancienne API Java, je construirais simplement une Date à partir de celle-ci avec

Date myDate = new Date(startDateLong)

Quel est l'équivalent dans les classes LocalDate/LocalDateTime de Java 8?

Je suis intéressé par la conversion du moment indiqué par le long en un LocalDate dans mon fuseau horaire local actuel.

138
Vihung

Si vous avez les millisecondes depuis l’époque et que vous voulez les convertir en date locale en utilisant le fuseau horaire local actuel, vous pouvez utiliser

LocalDate date =
    Instant.ofEpochMilli(longValue).atZone(ZoneId.systemDefault()).toLocalDate();

cependant, gardez à l’esprit que même le fuseau horaire par défaut du système peut changer. Ainsi, la même valeur long peut produire un résultat différent lors des exécutions suivantes, même sur le même ordinateur.

De plus, gardez à l'esprit que LocalDate, contrairement à Java.util.Date, représente réellement une date, et non une date et une heure.

Sinon, vous pouvez utiliser une LocalDateTime:

LocalDateTime date =
    LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());
265
Holger

Vous pouvez commencer par Instant.ofEpochMilli (long) :

LocalDate date =
  Instant.ofEpochMilli(startDateLong)
  .atZone(ZoneId.systemDefault())
  .toLocalDate();
25
Meno Hochschild

Je pense avoir une meilleure réponse. 

new Timestamp(longEpochTime).toLocalDateTime();
8
Abhijeet

Les fuseaux horaires et les choses de côté, une alternative très simple à new Date(startDateLong) pourrait être LocalDate.ofEpochDay(startDateLong / 86400000L)

3
Michael Piefel

Dans un cas spécifique où votre horodatage Epoch secondes provient de SQL ou est lié à SQL, vous pouvez l'obtenir comme suit:

long startDateLong = <...>

LocalDate theDate = new Java.sql.Date(startDateLong).toLocalDate();
0
M. Prokhorov