Wie konvertiere ich ein LocalDate in ein Instant?

106

Ich arbeite mit der neuen DateTime-API von Java 8.

Wie konvertiere ich ein LocalDate in ein Instant? Ich bekomme eine Ausnahme mit

LocalDate date = LocalDate.of(2012, 2, 2);
Instant instant = Instant.from(date);

und ich verstehe nicht warum.

user1643352
quelle
Weil a LocalDatekeine Zeit enthält.
OrangeDog

Antworten:

97

Die InstantKlasse repräsentiert einen augenblicklichen Punkt auf der Zeitachse. Die Konvertierung von und nach a LocalDateerfordert eine Zeitzone. Im Gegensatz zu einigen anderen Datums- und Zeitbibliotheken wählt JSR-310 die Zeitzone nicht automatisch für Sie aus, daher müssen Sie sie bereitstellen.

LocalDate date = LocalDate.now();
Instant instant = date.atStartOfDay(ZoneId.systemDefault()).toInstant();

In diesem Beispiel wird die Standardzeitzone der JVM - ZoneId.systemDefault()- verwendet, um die Konvertierung durchzuführen. Hier finden Sie eine längere Antwort auf eine verwandte Frage.


Update: Die akzeptierte Antwort verwendet, LocalDateTime::toInstant(ZoneOffset)die nur akzeptiert ZoneOffset. Diese Antwort verwendet, LocalDate::atStartOfDay(ZoneId)die keine akzeptiert ZoneId. Daher ist diese Antwort im Allgemeinen nützlicher (und sollte wahrscheinlich die akzeptierte sein).

PS. Ich war der Hauptautor der API

JodaStephen
quelle
1
Ich denke, dies ist nützlicher als die akzeptierte Antwort, da ZoneId (Zeitzone) der Parameter ist und nicht ZoneOffset (Stunden verschoben von UTC, die sich für eine Zeitzone im Sommer / Winter ändern können).
wuerg
1
In einem Unit-Test, den ich schreibe, habe ich ein LocalDate, das in einen com.google.protobuf.Timestamp konvertiert und dann über einen Instant in beide Richtungen einem LocalDate zugeordnet wird. Wenn ich den Ansatz verwende, den die akzeptierte Antwort vorschlägt, erhalte ich das erwartete LocalDate als Gegenleistung, aber wenn ich diesen Ansatz verwende, bekomme ich "gestern" zurück anstatt "heute". Meine Zeitzone ist GMT + 1
Nadrendion
127

Um es in einen Moment zu konvertieren, benötigen Sie eine LocalDateTime-Instanz, z.

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)
mdo
quelle
Vielen Dank. Ich verstehe jetzt, dass ich eine Zeitzone angeben muss, um einen Instant zu erhalten.
user1643352