manejo localdatetime horas ejemplo time java-8 epoch java-time

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();