Eu tenho uma API externa que me retorna datas como long
s, representadas como milissegundos desde o início da época.
Com a API Java de estilo antigo, eu simplesmente construía uma Date
com
Date myDate = new Date(startDateLong)
Qual é o equivalente em Java 8's LocalDate
/ LocalDateTime
classes?
Estou interessado em converter o ponto no tempo representado por long
para para LocalDate
no meu fuso horário local atual.
java.util.Date
nunca foi realmente um encontro dessa maneiraLocalDate
- foi um instante no tempo também.java.util.Date
intoLocalDate
File.lastModified()
(época milis) paraLocalDate(Time)
.Respostas:
Se você possui os milissegundos desde a época e deseja convertê-los em uma data local usando o fuso horário local atual, pode usar
mas lembre-se de que mesmo o fuso horário padrão do sistema pode mudar, portanto, o mesmo
long
valor pode produzir resultados diferentes nas execuções subseqüentes, mesmo na mesma máquina.Além disso, lembre-se de que
LocalDate
, ao contráriojava.util.Date
, realmente representa uma data, não uma data e hora.Caso contrário, você pode usar um
LocalDateTime
:fonte
LocalDateTime.ofEpochSecond(…)
requer um realZoneOffset
, masZoneId.systemDefault()
retorna aZoneId
. UmZoneId
pode mapear para diferentes deslocamentos, dependendo do ponto no tempo ao qual você está se referindo. É o queLocalDateTime.ofInstant
faz para você, convertendo o especificado deZoneId
acordo com o fornecidoInstant
.LocalDate
ouLocalDateTime
. Você pode especificar qualquer fuso horário que desejar, desde que seja consistente com o uso subsequente desses objetos de resultado. Pense no que acontece quando você lida com vários objetos criados por métodos diferentes. Os casos de uso típicos de locais data ou datetimes incorporar fuso horário padrão do sistema, por exemploLocalDateTime.now()
≈LocalDateTime.ofInstant(Instant.ofEpochMilli(System.currentTimeMillis()), ZoneId.systemDefault())
...Você pode começar com Instant.ofEpochMilli (long) :
fonte
Eu acho que tenho uma resposta melhor.
fonte
Timestamp
classe é mal projetada e desatualizada há muito tempo. Seu código usará a configuração de fuso horário da JVM, mas como essa configuração pode ser alterada por outra parte do seu programa ou outro programa em execução na mesma JVM, não podemos ter certeza do que é.Fusos horários e outras coisas de lado, uma alternativa muito simples
new Date(startDateLong)
poderia serLocalDate.ofEpochDay(startDateLong / 86400000L)
fonte
java.time
não incluaDateTimeConstants
como Joda.java.util.concurrent.TimeUnit.MILLISECONDS.toDays(startDateLong)
substitua now.getTime () pelo seu valor longo.
fonte
Em um caso específico em que o carimbo de data e hora da sua época é proveniente do SQL ou está relacionado ao SQL de alguma forma, você pode obtê-lo assim:
fonte
LocalDate
deepoch-millis
", e eu mostro como, usandojava.sql.Date
para abreviar. Essa abordagem faz sentido no código que já está lidando com o JDBC em alguma capacidade e funciona muito bem. Se você ainda não está convencido, explique como isso não está relacionado à pergunta inicial.java.sql.Date
abordagem está entre as mais curtas disponíveis, em termos de código, e eu diria que não é tão útil ir emboraInstant
com todos os objetos temporais intermediários quando o resultado final for o mesmo.