Eu estou querendo saber se existe uma maneira de obter milissegundos atuais desde 1970/01/01 (época), utilizando o novo LocalDate
, LocalTime
ou LocalDateTime
classes de Java 8.
A maneira conhecida está abaixo:
long currentMilliseconds = new Date().getTime();
ou
long currentMilliseconds = System.currentTimeMillis();
System.currentTimeMillis()
?currentTimeMillis
seria irrelevante nesse contexto. Pense no Calendário + Relógio de parede com uma precisão muito boa e sem preocupações com fusos horários e localidade. Portanto, não há como voltar ao "UTC Time" de um LocalTimeRespostas:
Não sei bem o que você quer dizer com "milissegundos atuais", mas presumo que seja o número de milissegundos desde a "época", ou seja, meia-noite de 1º de janeiro de 1970, UTC.
Se você deseja encontrar o número de milissegundos desde a época no momento, use
System.currentTimeMillis()
como o Anubian Noob indicou . Nesse caso, não há razão para usar qualquer uma das novas APIs java.time para fazer isso.No entanto, talvez você já tenha um
LocalDateTime
objeto ou similar de algum lugar e deseje convertê-lo em milissegundos desde a época. Não é possível fazer isso diretamente, pois aLocalDateTime
família de objetos não tem noção de em que fuso horário eles estão. Portanto, as informações de fuso horário precisam ser fornecidas para encontrar o horário relativo à época, que está no UTC.Suponha que você tenha um
LocalDateTime
seguinte:Você precisa aplicar as informações de fuso horário, fornecendo a
ZonedDateTime
. Estou no mesmo fuso horário de Los Angeles, então eu faria algo assim:Obviamente, isso faz suposições sobre o fuso horário. E existem casos extremos que podem ocorrer, por exemplo, se a hora local indicar um horário próximo à transição do horário de verão. Vamos deixar isso de lado, mas você deve estar ciente de que esses casos existem.
De qualquer forma, se você puder obter um válido
ZonedDateTime
, poderá convertê-lo no número de milissegundos desde a época, da seguinte forma:fonte
getEpochSecond
método (via padrão ChronoZonedDateTime ). Não há necessidade deInstant
.zdt.toInstant().toEpochMilli();
você fornecerá os milissegundos para o valor UTC correspondente , não para a data e hora da zona. Achei isso da maneira mais difícil.toInstant()
fornece um instante UTC. Se você quiser a hora local em milis, isso não fornecerá o que você espera . Portanto, se você estiver, por exemplo, usando um tempo de zoneamento +02: 00, o tempo retornado será 3600 * 2 * 1000 milissegundos menor do que o esperado.ZonedDateTime.now().toInstant().toEpochMilli()
,LocalDateTime.now().toInstant(OffsetDateTime.now().getOffset()).toEpochMilli()
,LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli()
,Calendar.getInstance().getTime().getTime()
,new Date().getTime()
eSystem.currentTimeMillis()
. O único método que parece "desativado" é o que você propôs:LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli()
fornece os milis para sua data local como se fosse uma data UTC , ou seja, se a data local for UTC + 2, seu método fornece milis por 2 horas no futuro .O que faço para não especificar um fuso horário é,
dá
Como você pode ver, os números são os mesmos, exceto por um pequeno tempo de execução.
Caso você não goste de System.currentTimeMillis, use
Instant.now().toEpochMilli()
fonte
Para evitar o ZoneId, você pode:
Obtendo 0 como valor, isso mesmo!
fonte
ZoneOffset.ofTotalSeconds(0)
é o mesmo queZoneOffset.UTC
ZoneOffset
é uma subclasse deZoneId
, então eu não iria dizer exatamente você ter evitado isso, mas enquanto você está feliz ...ZoneId
?Desde o Java 8 você pode ligar
java.time.Instant.toEpochMilli()
.Por exemplo, a chamada
fornece os mesmos resultados que
fonte
Você
java.sql.Timestamp
também pode usar para obter milissegundos.fonte
Timestamp
classe está desatualizada e cheia de problemas de design, então prefiro evitá-la, especialmente quando podemos usar as classes dejava.time
likeLocalDateTime
.Timestamp
, você pode compartilhar algum artigo sobre isso? Isso me ajuda a evitar o usoTimestamp
do meu código também. Obrigado!Date
mas geralmente não pode ser tratado como umDate
. A maioria dos métodos herdados deDate
e um construtor está obsoleta. SeutoString
método usa o fuso horário da JVM, que confunde muitos, pois o mesmoTimestamp
é impresso de maneira diferente em computadores diferentes ( exemplo ).LocalDate.of(year, month, day)
Para obter o tempo atual em milissegundos (desde a época), use
System.currentTimeMillis()
.fonte
Se você tiver um Java 8 Clock, poderá usá-
clock.millis()
lo (embora seja recomendávelclock.instant()
obter o Java 8 Instant, pois é mais preciso).Por que você usaria um relógio Java 8? Portanto, em sua estrutura DI, você pode criar um bean Clock:
e, em seus testes, você pode zombar facilmente:
ou você pode ter um bean diferente:
o que ajuda com testes que afirmam datas e horários imensamente.
fonte
fonte
Por que ninguém mencionou o método
LocalDateTime.toEpochSecond()
:Isso parece muito mais curto do que muitas respostas sugeridas acima ...
fonte
toEpochMilli
método, levando em consideração o fato de que você pode especificar até nanossegundos em LocalDateTime: existe um métodoLocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
.