gettimezone example chile change java java-8 timezone timezoneoffset

example - timezone java chile



¿Cómo obtener ZoneOffset por defecto en java8? (1)

Con java8, sabemos que el uso de ZoneId.default() puede obtener el ZoneId predeterminado del sistema, pero ¿cómo obtener el ZoneOffset predeterminado?

Veo que un ZoneId tiene algunas "reglas" y cada regla tiene un ZoneOffset , ¿eso significa que un ZoneId puede tener más de un ZoneOffset ?


tl; dr

OffsetDateTime.now().getOffset()

Desplazamiento frente a zona horaria

Un offset-from-UTC es simplemente una cantidad de horas, minutos y segundos, nada más.

Una zona horaria es un historial de compensaciones para una región en particular más un conjunto de reglas para manejar anomalías, como el horario de verano (DST), que causa cambios en el desplazamiento en períodos de tiempo específicos.

Zona horaria = (Historial de compensaciones + Reglas para anomalías)

Así que mejor usar una zona cuando se conoce.

El desplazamiento para cualquier región varía con el tiempo. Por ejemplo, el horario de verano en los Estados Unidos desplaza el desplazamiento en una hora durante aproximadamente la mitad del año y luego restaura esa hora en el desplazamiento durante la otra mitad del año. El propósito completo de una zona horaria es documentar esos cambios en el desplazamiento.

Así que realmente no tiene sentido pedir una compensación sin una fecha y hora . En America/Los_Angeles , por ejemplo, en parte de este año, la compensación es -08:00 pero en otra parte del año es -07:00 durante el horario de verano.

OffsetDateTime

Así que especifiquemos un momento como un OffsetDateTime , y luego extraemos el ZoneOffset .

OffsetDateTime odt = OffsetDateTime.now (); ZoneOffset zoneOffset = odt.getOffset ();

odt.toString (): 2017-01-02T15: 19: 47.162-08: 00

zoneOffset.toString (): -08: 00

Ese método now está aplicando implícitamente la zona horaria predeterminada actual de la JVM. Le sugiero que siempre haga eso explícito especificando su zona horaria deseada / esperada. Incluso si desea la zona predeterminada actual, dígalo explícitamente para aclarar sus intenciones. Elimine la ambigüedad acerca de si pretendía el valor predeterminado o no tuvo en cuenta la zona horaria como suele suceder con los programadores. Llame a ZoneId.systemDefault .

OffsetDateTime odt = OffsetDateTime.now ( ZoneId.systemDefault () ); ZoneOffset zoneOffset = odt.getOffset ();

ZoneId.systemDefault (). ToString (): America / Los_Angeles

odt: 2017-01-02T15: 19: 47.162-08: 00

zoneOffsetOfOdOdt: -08: 00

Una precaución acerca de la dependencia de la zona predeterminada: este código puede ser cambiado en cualquier momento por cualquier código en cualquier hilo dentro de la JVM. Si es importante, pregunte al usuario cuál es su zona horaria prevista.

Puede solicitar al desplazamiento su tiempo como un número total de segundos.

int offsetSeconds = zoneOffset.getTotalSeconds ();

offsetSeconds: -28800

ZonedDateTime

Otro ejemplo: quizás quiera saber cuál será el desplazamiento el día de Navidad de este año en Quebec. Especifique la zona horaria America/Montreal , obtenga un ZonedDateTime , solicite su desplazamiento como un objeto ZoneOffset .

ZoneId z = ZoneId.of( "America/Montreal" ); LocalDate ld = LocalDate.of( 2017 , 12 , 25 ); ZonedDateTime zdtXmas = ld.atStartOfDay( z ); ZoneOffset zoneOffsetXmas = zdtXmas.getOffset();

zdtXmas.toString (): 2017-12-25T00: 00-05: 00 [América / Montreal]

zoneOffsetXmas.toString (): -05: 00

zoneOffsetXmas.getTotalSeconds (): -18000

ZoneId

Como lo sugiere el comentario de yanys, puede interrogar un ZoneId para un ZoneOffset particular pasando un momento como un Instant . La clase Instant representa un momento en la línea de tiempo en UTC con una resolución de nanoseconds (hasta nueve (9) dígitos de una fracción decimal).

Esta es solo otra ruta hacia el mismo destino. Al igual que con OffsetDateTime y ZonedDateTime discutidos anteriormente, estamos especificando (a) una zona horaria, y (b) un momento.

Instant instant = zdtXmas.toInstant(); ZoneOffset zo = z.getRules().getOffset( instant );

Para ZoneId: America / Montreal en el instante: 2017-12-25T05: 00: 00Z el ZoneOffset es: -05: 00

Ver el código de todos estos ejemplos en vivo en IdeOne.com .

ZoneOffset.systemDefault - ¿Error o característica?

La clase ZoneOffset , una subclase de ZoneId , está documentada como hereditaria del método systemDefault . Sin embargo, esto no funciona realmente.

ZoneOffset zoneOffset = ZoneOffset.systemDefault() ; // Fails to compile.

error: tipos incompatibles: ZoneId no se puede convertir a ZoneOffset

No estoy seguro de si este error de compilación es un error o una característica. Como se mencionó anteriormente, no me parece lógico pedir un desplazamiento predeterminado con una fecha y hora, por lo que tal vez el ZoneOffset.systemDefault debería fallar. Pero la documentación debería decirlo, con una explicación.

Traté de presentar un error por la falla del documento para solucionar este problema, pero me di por vencido, incapaz de determinar dónde y cómo presentar dicho informe de errores.

Acerca de java.time

El marco java.time está integrado en Java 8 y java.time posteriores. Estas clases sustituyen a las antiguas y problemáticas clases de fecha y hora como java.util.Date , Calendar , y SimpleDateFormat .

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

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

Puede intercambiar objetos java.time directamente con su base de datos. Utilice un controlador JDBC compatible con JDBC 4.2 o posterior. No se necesitan cadenas, no se necesitan clases java.sql.* .

¿Dónde obtener las clases java.time?

  • Java SE 8 , Java SE 9 , Java SE 10 , Java SE 11 y versiones posteriores: parte de la API estándar de Java con una implementación integrada.
    • Java 9 agrega algunas características menores y correcciones.
  • Java SE 6 y Java SE 7
    • La mayor parte de la funcionalidad de java.time está respaldada a Java 6 y 7 en ThreeTen-Backport .
  • Android
    • Versiones posteriores de las implementaciones de paquetes de Android de las clases java.time .
    • Para Android anterior (<26), el proyecto ThreeTen-Backport adapta ThreeTen-Backport (mencionado anteriormente). Vea Cómo usar ThreeTenABP… .

El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un terreno de prueba para posibles adiciones futuras a java.time. Puede encontrar algunas clases útiles aquí como Interval , YearWeek , YearQuarter , y more .