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ê.


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


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)

Muito obrigado. Eu entendo agora que preciso especificar um fuso horário para obter um Instant.
user1643352
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.