Ich habe eine externe API, die mir Daten als long
s zurückgibt , dargestellt als Millisekunden seit Beginn der Epoche.
Mit der alten Java-API würde ich einfach eine Date
daraus erstellen
Date myDate = new Date(startDateLong)
Was ist das Äquivalent in Java 8 LocalDate
/ LocalDateTime
Klassen?
Ich bin bei der Umwandlung der Zeitpunkt durch die dargestellte interessiert long
an eine LocalDate
in meiner aktuellen lokalen Zeitzone.
java.util.Date
nie wirklich ein Datum warLocalDate
- es war auch ein Augenblick in der Zeit.java.util.Date
inLocalDate
File.lastModified()
Antworten sind auch für diejenigen hilfreich, die versuchen, (Epoche Millis) zu konvertierenLocalDate(Time)
.Antworten:
Wenn Sie die Millisekunden seit der Epoche haben und sie unter Verwendung der aktuellen lokalen Zeitzone in ein lokales Datum konvertieren möchten, können Sie sie verwenden
Beachten Sie jedoch, dass sich auch die Standardzeitzone des Systems ändern
long
kann. Daher kann derselbe Wert bei nachfolgenden Läufen zu unterschiedlichen Ergebnissen führen, selbst auf demselben Computer.Denken Sie außerdem daran
LocalDate
, dass es sich im Gegensatz zujava.util.Date
wirklich um ein Datum handelt, nicht um ein Datum und eine Uhrzeit.Andernfalls können Sie Folgendes verwenden
LocalDateTime
:quelle
LocalDateTime.ofEpochSecond(…)
benötigt eine tatsächlicheZoneOffset
, gibt aberZoneId.systemDefault()
eine zurückZoneId
. AZoneId
kann je nach dem Zeitpunkt, auf den Sie sich beziehen, verschiedenen Offsets zugeordnet werden. Das ist es, wasLocalDateTime.ofInstant
für Sie getan wird, indem Sie die angegebenenZoneId
gemäß den bereitgestellten konvertierenInstant
.LocalDate
oderLocalDateTime
. Sie können eine beliebige Zeitzone angeben, sofern dies mit der späteren Verwendung dieser Ergebnisobjekte vereinbar ist. Überlegen Sie, was passiert, wenn Sie mit mehreren Objekten arbeiten, die mit unterschiedlichen Methoden erstellt wurden. Die typischen Anwendungsfälle für lokales Datum oder Datum beinhalten die Standardzeitzone des Systems, z. B.LocalDateTime.now()
≈LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.systemDefault())
…Sie können mit Instant.ofEpochMilli (lang) beginnen :
quelle
Ich denke, ich habe eine bessere Antwort.
quelle
Timestamp
Klasse ist schlecht gestaltet und längst veraltet. Ihr Code verwendet die Zeitzoneneinstellung der JVM. Da diese Einstellung jedoch von einem anderen Teil Ihres Programms oder einem anderen Programm, das in derselben JVM ausgeführt wird, geändert werden kann, können wir nicht ganz sicher sein, um was es sich handelt.Zeitzonen und andere Dinge beiseite, eine sehr einfache Alternative zu sein
new Date(startDateLong)
könnteLocalDate.ofEpochDay(startDateLong / 86400000L)
quelle
java.time
es nicht so istDateTimeConstants
wie Joda.java.util.concurrent.TimeUnit.MILLISECONDS.toDays(startDateLong)
Ersetzen Sie now.getTime () durch Ihren langen Wert.
quelle
In einem bestimmten Fall, in dem Ihr Zeitstempel für Epochensekunden aus SQL stammt oder irgendwie mit SQL zusammenhängt, können Sie ihn folgendermaßen erhalten:
quelle
LocalDate
von erhältepoch-millis
", und ich zeige, wie man es mitjava.sql.Date
Kurzschrift verwendet. Dieser Ansatz ist in Code sinnvoll, der sich bereits in gewisser Weise mit JDBC befasst, und funktioniert einwandfrei. Wenn Sie immer noch nicht überzeugt sind, erklären Sie, wie es nicht mit der Ausgangsfrage zusammenhängt.java.sql.Date
Ansatz zu den kürzesten verfügbaren Codes, und ich würde sagen, dass er nicht allzu nützlich istInstant
mit allen zeitlichen Zwischenobjekten zu gehen, wenn das Endergebnis das gleiche ist.