Me pregunto si hay una manera de conseguir milisegundos actuales desde 01/01/1970 (época) utilizando el nuevo LocalDate, LocalTimeo LocalDateTimeclases de Java 8.
La forma conocida es la siguiente:
long currentMilliseconds = new Date().getTime();o
long currentMilliseconds = System.currentTimeMillis();
System.currentTimeMillis()?currentTimeMillisserí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
LocalDateTimeobjeto similar en algún lugar y desee convertirlo a milisegundos desde la época. No es posible hacer eso directamente, ya que laLocalDateTimefamilia 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
LocalDateTimecomo 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
getEpochSecondmétodo (a través de ChronoZonedDateTime predeterminado ). No es necesario para elInstant.ZonedDateTimetambién tieneInstantsgetNanométodo, por lo que usted no sería capaz de reemplazar simplementeinstconzdten 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.UTCZoneOffsetes 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.Timestamptambién para obtener milisegundos.fuente
Timestampclase está desactualizada y llena de problemas de diseño, por lo que prefiero evitarla, especialmente cuando podemos usar las clases de mejava.timegustaLocalDateTime.Timestamp, ¿puedes compartir algún artículo sobre eso? También me ayuda a evitar el usoTimestampde mi código. ¡Gracias!Datepero a menudo no se puede manejar como unDate. La mayoría de los métodos heredados deDatey un constructor están en desuso. SutoStringmétodo utiliza la zona horaria de la JVM, lo que confunde a muchos ya que el mismoTimestampse 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
toEpochMillimé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).