horas - manejo de fechas en java
¿Cómo puedo crear un Java 8 LocalDate a partir de una larga época en milisegundos? (5)
Tengo una API externa que me devuelve fechas tan
long
, representadas como milisegundos desde Epoch.
Con la API de Java de estilo antiguo, simplemente construiría una
Date
partir de ella con
Date myDate = new Date(startDateLong)
¿Cuál es el equivalente en las clases
LocalDate
/
LocalDateTime
Java 8?
Estoy interesado en convertir el punto en el tiempo representado por el largo a
LocalDate
en mi zona horaria local actual.
Creo que tengo una mejor respuesta.
new Timestamp(longEpochTime).toLocalDateTime();
Dejando a un lado las
LocalDate.ofEpochDay(startDateLong / 86400000L)
y otras cosas, una alternativa muy simple a la
new Date(startDateLong)
podría ser
LocalDate.ofEpochDay(startDateLong / 86400000L)
En un caso específico donde la marca de tiempo de los segundos de la época proviene de SQL o está relacionada con SQL de alguna manera, puede obtenerla así:
long startDateLong = <...>
LocalDate theDate = new java.sql.Date(startDateLong).toLocalDate();
Puede comenzar con Instant.ofEpochMilli(long) :
LocalDate date =
Instant.ofEpochMilli(startDateLong)
.atZone(ZoneId.systemDefault())
.toLocalDate();
Si tiene los milisegundos desde la época y desea convertirlos a una fecha local utilizando la zona horaria local actual, puede usar
LocalDate date =
Instant.ofEpochMilli(longValue).atZone(ZoneId.systemDefault()).toLocalDate();
pero tenga en cuenta que incluso la zona horaria predeterminada del sistema puede cambiar, por lo tanto, el mismo valor
long
puede producir resultados diferentes en ejecuciones posteriores, incluso en la misma máquina.
Además, tenga en cuenta que
LocalDate
, a diferencia de
java.util.Date
, realmente representa una fecha, no una fecha y hora.
De lo contrario, puede usar un
LocalDateTime
:
LocalDateTime date =
LocalDateTime.ofInstant(Instant.ofEpochMilli(longValue), ZoneId.systemDefault());