Me pregunto si hay una manera de conseguir milisegundos actuales desde 01/01/1970 (época) utilizando el nuevo LocalDate
, LocalTime
o LocalDateTime
clases de Java 8.
La forma conocida es la siguiente:
long currentMilliseconds = new Date().getTime();
o
long currentMilliseconds = System.currentTimeMillis();
System.currentTimeMillis()
?currentTimeMillis
sería irrelevante en ese contexto. Piense en Calendario + Reloj de pared con muy buena precisión y sin preocupaciones sobre zonas horarias y localidades. Así que no hay forma de volver a la "hora UTC" desde un horario localRespuestas:
No estoy completamente seguro de lo que quiere decir con "milisegundos actuales", pero supongo que es la cantidad de milisegundos desde la "época", es decir, la medianoche, 1 de enero de 1970 UTC.
Si desea encontrar el número de milisegundos desde la época en este momento, utilice
System.currentTimeMillis()
como Anubian Noob ha señalado . Si es así, no hay razón para usar ninguna de las nuevas API java.time para hacer esto.Sin embargo, tal vez ya tenga un
LocalDateTime
objeto similar en algún lugar y desee convertirlo a milisegundos desde la época. No es posible hacer eso directamente, ya que laLocalDateTime
familia de objetos no tiene idea de en qué zona horaria se encuentran. Por lo tanto, se debe proporcionar información sobre la zona horaria para encontrar la hora relativa a la época, que está en UTC.Supongamos que tienes una
LocalDateTime
como esta:Debe aplicar la información de zona horaria, dando a
ZonedDateTime
. Estoy en la misma zona horaria que Los Ángeles, así que haría algo como esto:Por supuesto, esto hace suposiciones sobre la zona horaria. Y hay casos extremos que pueden ocurrir, por ejemplo, si la hora local indica una hora cercana a la transición del horario de verano (horario de verano). Dejemos esto de lado, pero debe tener en cuenta que estos casos existen.
De todos modos, si puede obtener un valor válido
ZonedDateTime
, puede convertirlo a la cantidad de milisegundos desde la época, así:fuente
getEpochSecond
método (a través de ChronoZonedDateTime predeterminado ). No es necesario para elInstant
.ZonedDateTime
también tieneInstant
sgetNano
método, por lo que usted no sería capaz de reemplazar simplementeinst
conzdt
en su ejemplo?ZonedDateTime.now().toInstant().toEpochMilli()
,LocalDateTime.now().toInstant(OffsetDateTime.now().getOffset()).toEpochMilli()
,LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli()
,Calendar.getInstance().getTime().getTime()
,new Date().getTime()
ySystem.currentTimeMillis()
. El único método que parece "apagado" es el que propuso:LocalDateTime.now().toInstant(ZoneOffset.UTC).toEpochMilli()
le da los millis para su fecha local como si fuera una fecha UTC , es decir, si la fecha local es UTC + 2, su método le da millis durante 2 horas en el futuro .Lo que hago para no especificar una zona horaria es,
da
Como puede ver, los números son los mismos, excepto por un pequeño tiempo de ejecución.
En caso de que no le guste System.currentTimeMillis, use
Instant.now().toEpochMilli()
fuente
Para evitar ZoneId puedes hacer:
Obtener 0 como valor, ¡es correcto!
fuente
ZoneOffset.ofTotalSeconds(0)
es lo mismo queZoneOffset.UTC
ZoneOffset
es una subclase deZoneId
, por lo que no diría exactamente que lo has evitado, pero mientras estés feliz ...ZoneId
?Desde Java 8 puedes llamar
java.time.Instant.toEpochMilli()
.Por ejemplo la llamada
te da los mismos resultados que
fuente
Puede usar
java.sql.Timestamp
también para obtener milisegundos.fuente
Timestamp
clase está desactualizada y llena de problemas de diseño, por lo que prefiero evitarla, especialmente cuando podemos usar las clases de mejava.time
gustaLocalDateTime
.Timestamp
, ¿puedes compartir algún artículo sobre eso? También me ayuda a evitar el usoTimestamp
de mi código. ¡Gracias!Date
pero a menudo no se puede manejar como unDate
. La mayoría de los métodos heredados deDate
y un constructor están en desuso. SutoString
método utiliza la zona horaria de la JVM, lo que confunde a muchos ya que el mismoTimestamp
se imprime de manera diferente en diferentes computadoras ( ejemplo ).LocalDate.of(year, month, day)
Para obtener la hora actual en milisegundos (desde la época), use
System.currentTimeMillis()
.fuente
Si tiene un Java 8 Clock, puede usarlo
clock.millis()
(aunque se recomienda usarloclock.instant()
para obtener un Java 8 Instant, ya que es más preciso).¿Por qué usarías un reloj Java 8? Entonces, en su marco DI puede crear un bean Clock:
y luego en tus pruebas puedes burlarte fácilmente:
o puedes tener un bean diferente:
que ayuda con las pruebas que afirman fechas y horas inconmensurablemente.
fuente
fuente
¿Por qué nadie mencionó el método
LocalDateTime.toEpochSecond()
?Esto parece mucho más corto que muchas de las respuestas sugeridas anteriormente ...
fuente
toEpochMilli
método, teniendo en cuenta el hecho de que puede especificar incluso nanosegundos en LocalDateTime: hay un métodoLocalDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond)
.