Como converter um LocalDate em um Instant?

106

Eu trabalho com a nova API DateTime do Java 8.

Como converter um LocalDate em um Instant? Eu recebo uma exceção com

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

e eu não entendo por quê.

user1643352
fonte
Porque a LocalDatenão inclui um tempo.
OrangeDog

Respostas:

97

A Instantclasse representa um ponto instantâneo na linha do tempo. A conversão de e para um LocalDaterequer um fuso horário. Ao contrário de algumas outras bibliotecas de data e hora, JSR-310 não selecionará o fuso horário para você automaticamente, portanto, você deve fornecê-lo.

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

Este exemplo usa o fuso horário padrão da JVM - ZoneId.systemDefault()- para realizar a conversão. Veja aqui uma resposta mais longa a uma pergunta relacionada.


Atualização: A resposta aceita usa LocalDateTime::toInstant(ZoneOffset)que só aceita ZoneOffset. Esta resposta usa LocalDate::atStartOfDay(ZoneId)qual aceita qualquer ZoneId. Como tal, esta resposta é geralmente mais útil (e provavelmente deve ser a aceita).

PS. Eu fui o principal autor da API

JodaStephen
fonte
1
Acho que isso é mais útil do que a resposta aceita, já que ZoneId (fuso horário) é o parâmetro e não ZoneOffset (horas alteradas do UTC, que pode mudar para um fuso horário no verão / inverno).
wuerg
1
Em um teste de unidade que estou escrevendo, tenho um LocalDate, que é convertido em com.google.protobuf.Timestamp e, em seguida, mapeado de volta para um LocalDate por meio de um Instant, nos dois sentidos. Ao usar a abordagem que a resposta aceita sugere, obtenho o LocalDate esperado em troca, mas usar essa abordagem me dá "ontem" de volta em vez de "hoje". Meu fuso horário é GMT + 1
Nadrendion
127

Para convertê-lo em um instante, você precisa ter uma instância LocalDateTime, por exemplo:

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)
mdo
fonte
Muito obrigado. Eu entendo agora que preciso especificar um fuso horário para obter um Instant.
user1643352