Saltar al contenido

¿Hay alguna forma de convertir ZoneId a ZoneOffset en java 8?

Solución:

Así es como puedes conseguir ZoneOffset de ZoneId:

Instant instant = Instant.now(); //can be LocalDateTime
ZoneId systemZone = ZoneId.systemDefault(); // my timezone
ZoneOffset currentOffsetForMyZone = systemZone.getRules().getOffset(instant);

NÓTESE BIEN: ZoneId puede tener un desplazamiento diferente según el momento y la historia del lugar en particular. Por lo tanto, elegir diferentes instantes daría como resultado diferentes compensaciones.

NB2: ZoneId.of() puede devolver un ZoneOffset en lugar de ZoneId si UTC+3/GMT+2/ etc se pasa en lugar de una zona horaria como Africa/Cairo. Entonces, si se pasan las compensaciones UTC / GMT, entonces la información histórica / geográfica / de horario de verano del Instant no se tendrá en cuenta, simplemente trabajará con el desplazamiento especificado.

No hay mapeo uno a uno. Un ZoneId define una extensión geográfica en la que se usa un conjunto de diferentes ZoneOffsets a lo largo del tiempo. Si la zona horaria utiliza el horario de verano, su ZoneOffset será diferente entre verano e invierno.

Además, las reglas del horario de verano pueden haber cambiado con el tiempo, por lo que ZoneOffset podría ser diferente, por ejemplo, para el 13/10/2015 en comparación con el 13/10/1980.

Por lo tanto, solo puede encontrar el ZoneOffset para un ZoneId en un Instant en particular.

Véase también https://en.wikipedia.org/wiki/Tz_database

tl; dr

ZonedDateTime.now( 
    ZoneId.of( "America/Montreal" ) 
)

… de la zona horaria predeterminada actual …

ZonedDateTime.now( 
    ZoneId.systemDefault() 
)

Detalles

La respuesta de Stanislav Bshkyrtsev responde correcta y directamente a su pregunta.

Pero hay problemas más importantes involucrados, como se sugiere en la Respuesta de Jon Skeet.

LocalDateTime

No encuentro la manera de convertir epoch second a LocalDateTime

LocalDateTime intencionalmente no tiene un concepto de zona horaria o desplazamiento de UTC. Probablemente no sea lo que quieras. los Local… medio alguna localidad, no una localidad en particular. Esta clase hace no representa un momento, solo potencial momentos a lo largo de un rango de aproximadamente 26-27 horas (el rango de zonas horarias alrededor del mundo).

Instant

No es necesario comenzar con segundos de época si está tratando de obtener la hora actual. Obtener la corriente Instant. los Instant La clase representa un momento en la línea de tiempo en UTC con una resolución de nanosegundos (hasta nueve (9) dígitos de una fracción decimal).

Instant instant = Instant.now();

Dentro de eso Instant es un recuento de nanosegundos desde la época. Pero realmente no nos importa.

ZonedDateTime

Si desea ver ese momento a través de la lente del reloj de pared de una región en particular, aplique un ZoneId conseguir un ZonedDateTime.

ZoneId z = ZoneId.of( "Europe/Paris" );
ZonedDateTime zdt = instant.atZone( z );

Como atajo, puede hacerlo directamente en el ZonedDateTime.

ZonedDateTime zdt = ZonedDateTime.now( z );  

A ZonedDateTime tiene un Instant dentro de ella. Llama zdt.toInstant() para obtener el mismo momento en el tiempo que un valor básico en UTC. La misma cantidad de nanosegundos desde la época de cualquier manera, como ZonedDateTime o como un Instant.

Segundos desde la época dada

Si se le da un recuento de segundos desde la época, y la época es el primer momento de 1970 en UTC (1970-01-01T00:00:00Z), luego ingrese ese número a Instant.

long secondsSinceEpoch = 1_484_063_246L ;
Instant instant = Instant.ofEpochSecond( secondsSinceEpoch ) ;

Tabla de tipos de fecha y hora en Java, tanto moderno como heredado.


Sobre java.time

los java.time framework está integrado en Java 8 y versiones posteriores. Estas clases suplantan las antiguas y problemáticas clases de fecha y hora heredadas, como java.util.Date, CalendarY SimpleDateFormat.

Para obtener más información, consulte el Tutorial de Oracle. Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310.

los Joda-Time proyecto, ahora en modo de mantenimiento, aconseja la migración a las clases java.time.

Puedes intercambiar java.time objetos directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. Sin necesidad de cuerdas, sin necesidad de java.sql.* clases.

¿Dónde obtener las clases java.time?

  • Java SE 8, Java SE 9, Java SE 10, Java SE 11y posterior: parte de la API estándar de Java con una implementación integrada.

    • Java 9 agrega algunas características y correcciones menores.
  • Java SE 6 y Java SE 7

    • La mayoría de java.time la funcionalidad está respaldada a Java 6 y 7 en ThreeTen-Backport.
  • Androide

    • Versiones posteriores de implementaciones de paquetes de Android del java.time clases.
    • Para Android anterior (<26), el ThreeTenABP el proyecto se adapta ThreeTen-Backport (mencionado anteriormente). Ver Cómo usar ThreeTenABP….

los ThreeTen-Extra el proyecto extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí, como Interval, YearWeek, YearQuarter, y más.

¡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 *