¿Cómo convertir un LocalDate en un Instant?

106

Trabajo con la nueva API DateTime de Java 8.

¿Cómo convertir un LocalDate en un Instant? Obtengo una excepción con

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

y no entiendo por qué.

usuario1643352
fuente
Porque a LocalDateno incluye una hora.
OrangeDog

Respuestas:

97

La Instantclase representa un punto instantáneo en la línea de tiempo. La conversión hacia y desde a LocalDaterequiere una zona horaria. A diferencia de otras bibliotecas de fecha y hora, JSR-310 no seleccionará la zona horaria automáticamente, por lo que debe proporcionarla.

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

Este ejemplo utiliza la zona horaria predeterminada de la JVM - ZoneId.systemDefault()- para realizar la conversión. Consulte aquí para obtener una respuesta más extensa a una pregunta relacionada.


Actualización: La respuesta aceptada usa LocalDateTime::toInstant(ZoneOffset)que solo acepta ZoneOffset. Esta respuesta usa LocalDate::atStartOfDay(ZoneId)que acepta cualquiera ZoneId. Como tal, esta respuesta es generalmente más útil (y probablemente debería ser la aceptada).

PD. Yo era el autor principal de la API

JodaStephen
fuente
1
Creo que esta es la respuesta más útil que la aceptada, ya que ZoneId (zona horaria) es el parámetro y no ZoneOffset (horas desplazadas de UTC, que pueden cambiar para una zona horaria en verano / invierno).
wuerg
1
En una prueba unitaria que estoy escribiendo, tengo un LocalDate, que se convierte en un com.google.protobuf.Timestamp y luego se asigna de nuevo a un LocalDate a través de un Instant, en ambos sentidos. Cuando utilizo el enfoque que sugiere la respuesta aceptada, obtengo el LocalDate esperado a cambio, pero el uso de este enfoque me devuelve "ayer" en lugar de "hoy". Mi zona horaria es GMT + 1
Nadrendion
127

Para convertirlo en un instante, debe tener una instancia de LocalDateTime, por ejemplo:

LocalDate.now().atStartOfDay().toInstant(ZoneOffset.UTC)
mdo
fuente
Muchas gracias. Ahora comprendo que necesito especificar una zona horaria para obtener un Instant.
user1643352