Tengo una API externa que me devuelve fechas como long
s, representadas como milisegundos desde el comienzo de la época.
Con la API de Java de estilo antiguo, simplemente construiría una Date
de ella con
Date myDate = new Date(startDateLong)
¿Cuál es el equivalente en Java 8's LocalDate
/ LocalDateTime
classes?
Estoy interesado en convertir el punto en el tiempo representado por long
a LocalDate
en mi zona horaria local actual.
java.util.Date
nunca fue realmente una cita en la forma en que loLocalDate
es, también fue un instante en el tiempo.java.util.Date
enLocalDate
File.lastModified()
(epoch millis) aLocalDate(Time)
.Respuestas:
Si tiene los milisegundos desde la época y desea convertirlos a una fecha local utilizando la zona horaria local actual, puede usar
pero tenga en cuenta que incluso la zona horaria predeterminada del sistema puede cambiar, por lo tanto, el mismo
long
valor puede producir resultados diferentes en ejecuciones posteriores, incluso en la misma máquina.Además, tenga en cuenta que
LocalDate
, a diferenciajava.util.Date
, realmente representa una fecha, no una fecha y hora.De lo contrario, puede usar un
LocalDateTime
:fuente
LocalDateTime.ofEpochSecond(…)
requiere un realZoneOffset
, peroZoneId.systemDefault()
devuelve unZoneId
. A seZoneId
puede asignar a diferentes desplazamientos, según el momento al que se refiera. Eso es lo queLocalDateTime.ofInstant
hace por usted, convirtiendo lo especificado deZoneId
acuerdo con lo proporcionadoInstant
.LocalDate
oLocalDateTime
. Puede especificar cualquier zona horaria que desee, siempre que sea coherente con el uso posterior de estos objetos de resultado. Piense en lo que sucede cuando maneja múltiples objetos creados por diferentes métodos. Los casos de uso típicos para la fecha local o la fecha y hora incorporan la zona horaria predeterminada del sistema, por ejemplo,LocalDateTime.now()
≈LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.systemDefault())
...Puede comenzar con Instant.ofEpochMilli (largo) :
fuente
Creo que tengo una mejor respuesta.
fuente
Timestamp
clase está mal diseñada y anticuada desde hace mucho tiempo. Su código utilizará la configuración de zona horaria de la JVM, pero dado que esta configuración puede ser cambiada por otra parte de su programa u otro programa que se ejecute en la misma JVM, no podemos estar seguros de qué es.Dejando a un lado las zonas horarias y otras cosas, una alternativa muy simple
new Date(startDateLong)
podría serLocalDate.ofEpochDay(startDateLong / 86400000L)
fuente
java.time
no se incluyaDateTimeConstants
como lo hizo Joda.java.util.concurrent.TimeUnit.MILLISECONDS.toDays(startDateLong)
reemplace now.getTime () con su valor largo.
fuente
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 de esta manera:
fuente
LocalDate
deepoch-millis
", y muestro cómo, usando lajava.sql.Date
taquigrafía. Este enfoque tiene sentido en el código que ya está lidiando con JDBC en cierta capacidad, y funciona bien. Si aún no está convencido, explique cómo no está relacionado con la pregunta inicial.java.sql.Date
enfoque está entre los más cortos disponibles, en cuanto a código, y yo diría que no es tan útil irInstant
con todos los objetos temporales intermedios cuando el resultado final es el mismo.