¿Cómo extraigo el valor de época Long
de instancias de LocalDateTime
o LocalDate
? He intentado lo siguiente, pero me da otros resultados:
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
System.out.println(time.getLong(ChronoField.SECOND_OF_DAY)); // gives 71461
System.out.println(time.getLong(ChronoField.EPOCH_DAY)); // gives 16105
Lo que quiero es simplemente el valor 1391539861
de la fecha "04.02.2014 19:51:01"
y hora local . Mi zona horaria es Europe/Oslo
UTC + 1 con horario de verano.
LocalDateTime
otra que calcularla manualmente?Respuestas:
Las clases
LocalDate
yLocalDateTime
no contienen información sobre la zona horaria o el desplazamiento de tiempo , y los segundos desde época serían ambiguos sin esta información. Sin embargo, los objetos tienen varios métodos para convertirlos en objetos de fecha / hora con zonas horarias pasando unaZoneId
instancia.LocalDate
LocalDateTime
fuente
ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0))
long epoch = time.toEpochSecond(ZoneOffset.UTC)
para casos UTC, o donde ya conoce la zona horaria, olong epoch = time.toEpochSecond(ZoneId.systemDefault());
si desea seguir esa ruta.Instant.ofEpochMilli(responseTime).atZone(ZoneId.systemDefault()).toLocalTime()
'Millis desde unix epoch' representa un instante, por lo que debe usar la clase Instant:
fuente
ZoneId.systemDefault()
porque la época de Unix se refiere a UTCLa conversión que necesita requiere el desplazamiento de UTC / Greewich o una zona horaria.
Si usted tiene un offset, hay un método específico de
LocalDateTime
para esta tarea:Si solo tiene un
ZoneId
, puede obtenerloZoneOffset
enZoneId
:Pero puede encontrar una conversión
ZonedDateTime
más simple:fuente
long epochSec = localDateTime.toEpochSecond(ZoneOffset.UTC);
Mire este método para ver qué campos son compatibles. Encontrarás para
LocalDateTime
:El campo INSTANT_SECONDS, por supuesto, no es compatible porque
LocalDateTime
no puede hacer referencia a ninguna marca de tiempo absoluta (global). Pero lo que es útil es el campo EPOCH_DAY que cuenta los días transcurridos desde 1970-01-01. Pensamientos similares son válidos para el tipoLocalDate
(con campos aún menos admitidos).Si tiene la intención de obtener el campo milis-since-unix-epoch que no existe, también necesita la zona horaria para convertir de un tipo local a global. Esta conversión se puede hacer mucho más simple, vea otras publicaciones SO .
Volviendo a su pregunta y los números en su código:
16105L * 86400 + 71461 = 1391543461 segundos desde 1970-01-01T00: 00: 00 (atención, sin zona horaria) Luego puede restar el desplazamiento de la zona horaria (tenga cuidado con la posible multiplicación por 1000 si está en milisegundos).
ACTUALIZAR después de la información de zona horaria dada:
Como código JSR-310 con dos enfoques equivalentes:
fuente
LocalDateTime time = LocalDateTime.parse("04.02.2014 19:51:01", DateTimeFormatter.ofPattern("dd.MM.yyyy HH:mm:ss"));
y luegoLong epoch = time.atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();
.Convertir de fecha legible por humanos a época :
Convertir de época a fecha legible por humanos :
Para otro conversor de idiomas: https://www.epochconverter.com
fuente
Esta es una forma sin usar el tiempo como una zona:
fuente