Saltar al contenido

Cómo obtener milisegundos de LocalDateTime en Java 8

Tenemos la mejor información que hallamos en todo internet. Deseamos que te sea de ayuda y si puedes compartir cualquier detalle que nos pueda ayudar a mejorar hazlo con total libertad.

Solución:

No estoy del todo seguro de lo que quiere decir con “milisegundos actuales”, pero supondré que es la cantidad de milisegundos desde la “época”, es decir, la medianoche del 1 de enero de 1970 UTC.

Si desea encontrar el número de milisegundos desde la época en este momento, entonces usa System.currentTimeMillis() como ha señalado Anubian Noob. 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 una LocalDateTime o un objeto similar de algún lugar y desea convertirlo a milisegundos desde la época. No es posible hacerlo directamente, ya que el LocalDateTime la familia de objetos no tiene noción de la zona horaria en la que se encuentran. Por lo tanto, se debe proporcionar información de la zona horaria para encontrar la hora relativa a la época, que está en UTC.

Supongamos que tienes un LocalDateTime como esto:

LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);

Debe aplicar la información de la zona horaria, dando un ZonedDateTime. Estoy en la misma zona horaria que Los Ángeles, así que haría algo como esto:

ZonedDateTime zdt = ldt.atZone(ZoneId.of("America/Los_Angeles"));

Por supuesto, esto hace suposiciones sobre la zona horaria. Y hay casos extremos que pueden ocurrir, por ejemplo, si la hora local pasa a nombrar una hora cercana a la transición del horario de verano (horario de verano). Dejemos estos a un lado, pero debe tener en cuenta que estos casos existen.

De todos modos, si puedes conseguir un válido ZonedDateTimepuede convertir esto a la cantidad de milisegundos desde la época, así:

long millis = zdt.toInstant().toEpochMilli();

Lo que hago para no especificar una zona horaria es,

System.out.println("ldt " + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm " + System.currentTimeMillis());

da

ldt 1424812121078 
ctm 1424812121281

Como puede ver, los números son los mismos excepto por un pequeño tiempo de ejecución.

En caso de que no te guste System.currentTimeMillis, usa Instant.now().toEpochMilli()

Para evitar ZoneId puedes hacer:

LocalDateTime date = LocalDateTime.of(1970, 1, 1, 0, 0);

System.out.println("Initial Epoch (TimeInMillis): " + date.toInstant(ZoneOffset.ofTotalSeconds(0)).toEpochMilli());

Obtener 0 como valor, ¡así es!

Reseñas y valoraciones del artículo

Si haces scroll puedes encontrar las acotaciones de otros programadores, tú igualmente puedes dejar el tuyo si dominas el tema.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *