it-swarm.com.de

Wie konvertiert man von Instant zu LocalDate?

Ich habe einen Instant aus einer Quelle, der gemäß der Spezifikation ein LocalDate sein sollte, in LocalDate jedoch keine Methoden für die Konvertierung sehen. Was ist der beste Weg, dies zu tun?

5
JL Gradley

LocalDate.ofInstant(...); Ich glaube, es wurde in Java 9 hinzugefügt.

LocalDateTime hat diese Methode in Java 8.

yourInstant.atZone(yourZoneId).toLocalDate(); Funktioniert mit früheren Versionen für LocalDate ...

10
Rob C

Sie müssen sich fragen, in welchen Zonenversatz Sie es höchstwahrscheinlich umwandeln möchten und wann Sie die Antwort darauf kennen:

LocalDate.ofInstant(yourInstant, yourZoneOffSet)

EDIT

habe gerade erkannt, dass dies nur seit Java-9 möglich ist, für eine Pre-Java9 siehe die andere Antwort

3
Eugene

Bei Verwendung von Java 8 können Sie Folgendes tun

Instant instantOfNow = Instant.now();
LocalDate localDate 
    = LocalDateTime.ofInstant(instantOfNow, ZoneOffset.UTC).toLocalDate();
2
Robbo_UK

Andere Antworten lieferten die Mechanik für die Transformation, aber ich wollte etwas Hintergrundwissen über die Bedeutung einer solchen Transformation hinzufügen, die hoffentlich erklärt, warum sie so funktioniert, wie sie funktioniert.


LocalDate und Instant sehen ähnlich aus - sie enthalten beide Datums- (/ Zeit-) Informationen ohne die Zeitzoneninformationen. Sie haben jedoch eine ganz andere Bedeutung.

Instant steht eindeutig für einen Zeitpunkt. Die Darstellung enthält explizit keine Zeitzone, bezieht sich jedoch implizit auf die UTC-Zeitleiste.

LocalDateTime (und LocalDate) ist mehrdeutig, da es einen Punkt in der Timeline local darstellt, der implizit auf die Zeitzone local verweist.

Um ein Instant richtig in ein LocalDateTime umzuwandeln (konzeptuell - einige dieser Schritte werden in einer einzigen Operation in der Implementierung gebündelt), müssen Sie Folgendes tun:
1. Konvertieren Sie Instant in ein ZonedDateTime, indem Sie die UTC-Zeitzoneninformationen anwenden
2. Ändern Sie die Zeitzone in local time zone (was den Zeitunterschied zwischen den Zeitzonen hinzufügt).
3. Konvertieren Sie ZonedDateTime in ein LocalDateTime, das die Zeitzone implizit ( local ) macht, indem Sie die Zeitzoneninformationen entfernen.

Schließlich können Sie den Zeitteil von LocalDateTime löschen und mit LocalDate enden.

0