horas - ¿Cómo extraer época de LocalDate y LocalDateTime?
localtime java (5)
¿Cómo se extrae el valor epoch en Long
de las 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
para la fecha local "04.02.2014 19:51:01"
. Mi zona horaria es Europe/Oslo
UTC + 1 con horario de verano.
''Millis desde unix epoch'' representa un instante, por lo que debe usar la clase Instant:
private long toEpochMilli(LocalDateTime localDateTime)
{
return localDateTime.atZone(ZoneId.systemDefault())
.toInstant().toEpochMilli();
}
Convertir de fecha legible por humanos a época :
long epoch = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").parse("01/01/1970 01:00:00").getTime() / 1000;
Convertir de época a fecha de lectura humana :
String date = new java.text.SimpleDateFormat("MM/dd/yyyyHH:mm:ss").format(new java.util.Date (epoch*1000));
Para otro convertidor de idioma: https://www.epochconverter.com
La conversión que necesita requiere la compensación de UTC / Greewich, o una zona horaria.
Si tiene un desplazamiento, hay un método dedicado en LocalDateTime
para esta tarea:
long epochSec = localDateTime.toEpochSecond(zoneOffset);
Si solo tiene un ZoneId
, puede obtener el ZoneOffset
de ZoneId
:
ZoneOffset zoneOffset = ZoneId.of("Europe/Oslo").getRules().getOffset(ldt);
Pero es posible que la conversión a través de ZonedDateTime
más simple:
long epochSec = ldt.atZone(zoneId).toEpochSecond();
Las clases LocalDate y LocalDateTime no tienen información sobre la zona horaria o la compensación de tiempo . Eso significa que primero debe proporcionar la zona horaria correcta.
LocalDate
LocalDate date = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = date.atStartOfDay(zoneId).toEpochSecond();
LocalDateTime
LocalDateTime time = ...;
ZoneId zoneId = ZoneId.systemDefault(); // or: ZoneId.of("Europe/Oslo");
long epoch = time.atZone(zoneId).toEpochSecond();
Mire este método para ver qué campos son compatibles. Encontrarás para LocalDateTime
:
•NANO_OF_SECOND
•NANO_OF_DAY
•MICRO_OF_SECOND
•MICRO_OF_DAY
•MILLI_OF_SECOND
•MILLI_OF_DAY
•SECOND_OF_MINUTE
•SECOND_OF_DAY
•MINUTE_OF_HOUR
•MINUTE_OF_DAY
•HOUR_OF_AMPM
•CLOCK_HOUR_OF_AMPM
•HOUR_OF_DAY
•CLOCK_HOUR_OF_DAY
•AMPM_OF_DAY
•DAY_OF_WEEK
•ALIGNED_DAY_OF_WEEK_IN_MONTH
•ALIGNED_DAY_OF_WEEK_IN_YEAR
•DAY_OF_MONTH
•DAY_OF_YEAR
•EPOCH_DAY
•ALIGNED_WEEK_OF_MONTH
•ALIGNED_WEEK_OF_YEAR
•MONTH_OF_YEAR
•PROLEPTIC_MONTH
•YEAR_OF_ERA
•YEAR
•ERA
El campo INSTANT_SECONDS es, por supuesto, no admitido porque un 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 tipo LocalDate
(con incluso menos campos compatibles).
Si tiene la intención de obtener el campo millis-from-unix-epoch no existente, también necesita la zona horaria para convertir de un tipo local a uno global. Esta conversión se puede hacer mucho más simple, vea otras SO-posts .
Volviendo a su pregunta y los números en su código:
The result 1605 is correct
=> (2014 - 1970) * 365 + 11 (leap days) + 31 (in january 2014) + 3 (in february 2014)
The result 71461 is also correct => 19 * 3600 + 51 * 60 + 1
16105L * 86400 + 71461 = 1391543461 segundos desde 1970-01-01T00: 00: 00 (atención, sin zona horaria) A continuación, puede restar el desplazamiento de la zona horaria (tenga cuidado con la posible multiplicación por 1000 si en milisegundos).
ACTUALIZACIÓN después de la información de zona horaria dada:
local time = 1391543461 secs
offset = 3600 secs (Europe/Oslo, winter time in february)
utc = 1391543461 - 3600 = 1391539861
Como código JSR-310 con dos enfoques equivalentes:
long secondsSinceUnixEpoch1 =
LocalDateTime.of(2014, 2, 4, 19, 51, 1).atZone(ZoneId.of("Europe/Oslo")).toEpochSecond();
long secondsSinceUnixEpoch2 =
LocalDate
.of(2014, 2, 4)
.atTime(19, 51, 1)
.atZone(ZoneId.of("Europe/Oslo"))
.toEpochSecond();