java - instant - localdatetime instance
Cómo obtener milisegundos de LocalDateTime en Java 8 (5)
Me pregunto si hay una forma de obtener milisegundos actuales desde 1-1-1970 (época) usando las nuevas LocalDate
, LocalTime
o LocalDateTime
de Java 8.
La forma conocida es a continuación:
long currentMilliseconds = new Date().getTime();
o
long currentMilliseconds = System.currentTimeMillis();
Desde Java 8 puedes usar
final long currentTimeJava8 = Instant.now().toEpochMilli();
que te da los mismos resultados que
final long currentTimeJava1 = System.currentTimeMillis();
Lo que hago, así que no especifico un huso horario,
System.out.println("ldt " + LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant().toEpochMilli());
System.out.println("ctm " + System.currentTimeMillis());
da
ldt 1424812121078
ctm 1424812121281
En caso de que no te guste System.current ...., usa Instant.now().toEpochMilli()
No estoy del todo seguro de lo que quiere decir con "milisegundos actuales", pero supongo 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 use System.currentTimeMillis()
como Anubian Noob ha señalado . Si es así, no hay ninguna razón para usar cualquiera de las nuevas API de java.time para hacer esto.
Sin embargo, tal vez ya tenga un LocalDateTime
u objeto similar de alguna parte y quiera convertirlo a milisegundos desde la época. No es posible hacerlo directamente, ya que la familia de objetos LocalDateTime
no tiene ninguna noción de la zona horaria en la que se encuentran. Por lo tanto, se debe proporcionar información de zona horaria para encontrar el tiempo relativo a la época, que está en UTC.
Supongamos que tiene un LocalDateTime
como este:
LocalDateTime ldt = LocalDateTime.of(2014, 5, 29, 18, 41, 16);
ZonedDateTime
aplicar la información de 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 el huso horario. 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). Vamos a dejar esto de lado, pero debes tener en cuenta que estos casos existen.
De todos modos, si puede obtener un ZonedDateTime
válido, puede convertir esto a la cantidad de milisegundos desde la época, de la siguiente manera:
long millis = zdt.toInstant().toEpochMilli();
Para evitar ZoneId puede 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, ¡correcto!
Para obtener la hora actual en milisegundos (desde la época), use System.currentTimeMillis()
.