Come convertire un LocalDate in un Instant?


106

Lavoro con la nuova API DateTime di Java 8.

Come convertire un LocalDate in un Instant? Ottengo un'eccezione con

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

e non capisco perché.


Perché a LocalDatenon include un tempo.
OrangeDog

Risposte:


97

La Instantclasse rappresenta un punto istantaneo sulla sequenza temporale. La conversione in e da a LocalDaterichiede un fuso orario. A differenza di altre librerie di data e ora, JSR-310 non selezionerà automaticamente il fuso orario, quindi è necessario fornirlo.

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

Questo esempio utilizza il fuso orario predefinito della JVM - ZoneId.systemDefault()- per eseguire la conversione. Vedi qui per una risposta più lunga a una domanda correlata.


Aggiornamento: la risposta accettata utilizza LocalDateTime::toInstant(ZoneOffset)che accetta solo ZoneOffset. Questa risposta utilizza LocalDate::atStartOfDay(ZoneId)che accetta qualsiasi ZoneId. In quanto tale, questa risposta è generalmente più utile (e probabilmente dovrebbe essere quella accettata).

PS. Sono stato l'autore principale dell'API


1
Penso che questa sia la risposta più utile rispetto alla risposta accettata poiché ZoneId (fuso orario) è il parametro e non ZoneOffset (ore spostate da UTC, che possono cambiare per un fuso orario in estate / inverno).
wuerg

1
In uno unit test che sto scrivendo, ho un LocalDate, che viene convertito in com.google.protobuf.Timestamp e quindi mappato di nuovo in un LocalDate tramite un Instant, in entrambi i modi. Quando si utilizza l'approccio suggerito dalla risposta accettata, ottengo in cambio il LocalDate previsto, ma l'utilizzo di questo approccio restituisce "ieri" invece di "oggi". Il mio fuso orario è GMT + 1
Nadrendion

127

Per convertirlo in un istante è necessario disporre di un'istanza LocalDateTime, ad esempio:

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)

Molte grazie. Capisco ora che devo specificare un fuso orario per ottenere un Instant.
user1643352
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.