J'ai une API externe qui me renvoie des dates en long
s, représentées en millisecondes depuis le début de l'époque.
Avec l'ancienne API Java de style, je construirais simplement un à Date
partir de celui-ci avec
Date myDate = new Date(startDateLong)
Quel est l'équivalent dans les classes LocalDate
/ Java 8 LocalDateTime
?
Je souhaite convertir le point dans le temps représenté par le long
a LocalDate
dans mon fuseau horaire local actuel.
java.util.Date
n'a jamais vraiment été un rendezLocalDate
-vous - c'était aussi un instant dans le temps.java.util.Date
enLocalDate
File.lastModified()
(epoch millis) enLocalDate(Time)
.Réponses:
Si vous disposez des millisecondes depuis l'époque et que vous souhaitez les convertir en date locale à l'aide du fuseau horaire local actuel, vous pouvez utiliser
mais gardez à l'esprit que même le fuseau horaire par défaut du système peut changer, donc la même
long
valeur peut produire des résultats différents lors des exécutions suivantes, même sur la même machine.De plus, gardez à l'esprit que
LocalDate
, contrairement àjava.util.Date
, représente vraiment une date, pas une date et une heure.Sinon, vous pouvez utiliser
LocalDateTime
:la source
LocalDateTime.ofEpochSecond(…)
nécessite un réelZoneOffset
, maisZoneId.systemDefault()
renvoie unZoneId
. UnZoneId
peut correspondre à différents décalages, selon le moment auquel vous vous référez. C'est ceLocalDateTime.ofInstant
que vous faites, en convertissant le spécifié enZoneId
fonction du fourniInstant
.LocalDate
ou résultantLocalDateTime
. Vous pouvez spécifier n'importe quel fuseau horaire de votre choix, à condition qu'il soit cohérent avec l'utilisation ultérieure de ces objets de résultat. Pensez à ce qui se passe lorsque vous traitez plusieurs objets créés par différentes méthodes. Les cas d'utilisation typiques pour la date ou les heures locales incluent le fuseau horaire par défaut du système, par exempleLocalDateTime.now()
≈LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.systemDefault())
…Vous pouvez commencer avec Instant.ofEpochMilli (long) :
la source
Je pense que j'ai une meilleure réponse.
la source
Timestamp
classe est mal conçue et dépassée depuis longtemps. Votre code utilisera le paramètre de fuseau horaire de la JVM, mais comme ce paramètre peut être modifié par une autre partie de votre programme ou un autre programme fonctionnant dans la même JVM, nous ne pouvons pas être tout à fait sûr de ce qu'il est.Et d'autres choses de côté les fuseaux horaires, une alternative très simple
new Date(startDateLong)
pourrait êtreLocalDate.ofEpochDay(startDateLong / 86400000L)
la source
java.time
n'inclut pasDateTimeConstants
comme Joda l'a fait.java.util.concurrent.TimeUnit.MILLISECONDS.toDays(startDateLong)
remplacez now.getTime () par votre valeur longue.
la source
Dans un cas spécifique où votre horodatage epoch seconds provient de SQL ou est lié à SQL d'une manière ou d'une autre, vous pouvez l'obtenir comme ceci:
la source
LocalDate
deepoch-millis
", et je montre comment, en utilisantjava.sql.Date
pour la sténographie. Cette approche est logique dans le code qui traite déjà avec JDBC dans une certaine mesure, et cela fonctionne très bien. Si vous n'êtes toujours pas convaincu, expliquez en quoi cela n'est pas lié à la question initiale.java.sql.Date
approche est parmi les plus courtes disponibles, au niveau du code, et je dirais que ce n'est pas du tout utile aller bienInstant
avec tous les objets temporels intermédiaires lorsque le résultat final est le même.