¿Admite el POSIX TZ Descripción JRE en lugar del nombre TZ?

Necesidades Jason:

Java no parece aplicarse a compensar el horario de verano cuando el sistema operativo utiliza una zona horaria POSIX descripción en lugar de una zona horaria nombre . Es el uso de una descripción TZ no soportado por el JRE o se trata de un comportamiento un error?

Más detalles...

Estoy trabajando en un sistema basado en Linux (Debian), donde la variable de entorno TZ se establece en un POSIX TZ formateado como STD+7DST+6,M3.2.0/02:00:00,M11.1.0/02:00:00lugar de un nombre como TZ America/Denver. (Véase la variable TZ )

Si bien esto parece funcionar correctamente para datey herramientas del sistema relacionados, cuando trato de encontrar el tiempo en una aplicación Java, no parece que haya sido correctamente ajustar el horario de verano. Este resultado en el momento equivocado para una parte del año, cuando el horario de verano está en vigor.

He probado esto en un varios sistemas diferentes y visto los mismos resultados en cada (test w resultados / son a continuación)

Este comportamiento en realidad apareció en una aplicación que utiliza cuarzo Programador pero desde entonces he sido capaz de reproducir el problema con la siguiente SSCCE :

import java.util.Date;
import java.util.TimeZone;

public class CheckTime {
    public static void main(String[] args) {
        TimeZone tz = TimeZone.getDefault();
        Date now = new Date();
        System.out.println("Current time " + now.toString());
        System.out.println("Current time zone " + tz.getDisplayName());
        System.out.println("Current time zone in DST? " + tz.inDaylightTime(now));
    }
}

Ubuntu 18.04.2 LTS (biónica)

$ java -version
openjdk version "1.8.0_222"
OpenJDK Runtime Environment (build 1.8.0_222-8u222-b10-1ubuntu1~18.04.1-b10)
OpenJDK 64-Bit Server VM (build 25.222-b10, mixed mode)

$ export TZ="STD+7DST+6,M3.2.0/02:00:00,M11.1.0/02:00:00"
$ date
Fri Aug  9 07:02:27 DST 2019
$ java CheckTime
Current time Fri Aug 09 06:02:30 GMT-07:00 2019
Current timezone GMT-07:00
Current timezone in DST? false

$ export TZ="America/Denver"
$ date
Fri Aug  9 07:03:29 MDT 2019
$ java CheckTime
Current time Fri Aug 09 07:03:32 MDT 2019
Current timezone Mountain Standard Time
Current timezone in DST? true

ARM32hf de generación personalizada, basada en Debian (kernel 4.1.0-Altera)

$ java -version
openjdk version "1.8.0_162"
OpenJDK Runtime Environment (Zulu Embedded 8.27.0.91-linux-aarch32hf) (build 1.8.0_162-b91)

$ export TZ="STD+7DST+6,M3.2.0/02:00:00,M11.1.0/02:00:00"
$ date
Fri Aug  9 07:06:59 DST 2019
$ java CheckTime
Current time Fri Aug 09 06:07:03 GMT-07:00 2019
Current time zone GMT-07:00
Current time zone in DST? false

$ export TZ="America/Denver"
$ date
Fri Aug  9 07:09:45 MDT 2019
$ java CheckTime
Current time Fri Aug 09 07:09:49 MDT 2019
Current time zone Mountain Standard Time
Current time zone in DST? true

Raspbian 9,9 (estiramiento)

$ java -version
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) Client VM (build 25.65-b01, mixed mode)

$ export TZ="STD+7DST+6,M3.2.0/02:00:00,M11.1.0/02:00:00"
$ date
Fri Aug  9 07:12:52 DST 2019
$ java CheckTime
Current time Fri Aug 09 06:12:57 GMT-07:00 2019
Current time zone GMT-07:00
Current time zone in DST? false

$ export TZ="America/Denver"
$ date
Fri Aug  9 07:13:42 MDT 2019
$ java CheckTime
Current time Fri Aug 09 07:13:44 MDT 2019
Current time zone Mountain Standard Time
Current time zone in DST? true

EDITAR

Curiosamente, veo resultados ligeramente diferentes en un Mac. Java todavía no informa de que el sistema está en el horario de verano, pero al menos los informes de la hora local correcta.

MacOS 10.14.6 (Mojave)

$ java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment Corretto-8.212.04.2 (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM Corretto-8.212.04.2 (build 25.212-b04, mixed mode)

$ export TZ="STD+7DST+6,M3.2.0/02:00:00,M11.1.0/02:00:00"
$ date
Fri Aug  9 09:47:14 DST 2019
$ java CheckTime
Current time Fri Aug 09 09:47:18 GMT-06:00 2019
Current timezone GMT-06:00
Current timezone in DST? false

$ export TZ="America/Denver"
$ date
Fri Aug  9 09:49:04 MDT 2019
$ java CheckTime
Current time Fri Aug 09 09:49:08 MDT 2019
Current timezone Mountain Standard Time
Current timezone in DST? true

$java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

$ export TZ="STD+7DST+6,M3.2.0/02:00:00,M11.1.0/02:00:00"
$ date
Fri Aug  9 10:19:23 DST 2019
$java CheckTime
Current time Fri Aug 09 10:19:40 GMT-06:00 2019
Current timezone GMT-06:00
Current timezone in DST? false

$ export TZ="America/Denver"
$ date
Fri Aug  9 10:21:03 MDT 2019
$ java CheckTime
Current time Fri Aug 09 10:21:07 MDT 2019
Current timezone Mountain Standard Time
Current timezone in DST? true

Stephen C:

No es un error. Es una característica.

Según el javadoc para ZoneId, que la sintaxis POSIX para especificar zonas no se admite:

IDs de husos horarios

El ID es único dentro del sistema. Hay tres tipos de identificación.

El tipo más simple de identificación es que a partir de ZoneOffset. Esto consiste en 'Z' y los ID que comienzan con '+' o '-'.

El siguiente tipo de identificación son los ID de estilo compensado con alguna forma de prefijo, como 'GMT + 2' o 'GMT + 01: 00'. Los prefijos son reconocidos 'UTC', 'GMT' y 'UT'. El desplazamiento es el sufijo y se normalizó durante la creación. Estos identificadores pueden normalizarse a un ZoneOffset usando normalizado ().

El tercer tipo de ID son identificadores basados ​​en regiones. Una identificación basada en la región debe ser de dos o más caracteres, y no empezar con 'UTC', 'GMT', 'UT' '+' o '-'. IDs basados ​​en regiones están definidas por la configuración, consulte ZoneRulesProvider. La configuración se centra en proporcionar la búsqueda de la ID a los ZoneRules subyacentes.

reglas de husos horarios se definen por los gobiernos y cambian con frecuencia. Hay una serie de organizaciones, conocido aquí como grupos, que vigilan los cambios de zona horaria y los clasifican. El grupo por defecto es la base de datos de IANA zona horaria (TZDB). Otras organizaciones incluyen la IATA (el organismo de la industria aérea) y Microsoft.

Cada grupo define su propio formato para el ID de región que proporciona. Los ID de grupo define los TZDB como 'Europa / Londres' o 'América / New_York'. TZDB identificadores tienen prioridad sobre otros grupos.

Ver también:

Si usted escribió algo de código para analizar la sintaxis, usted debe ser capaz de utilizar los datos para construir una SimpleTimeZone( javadoc ). Por desgracia, esto obliga a seguir usando el viejo ( "sobre todo en desuso") Dateamigos y clase.

La nueva (en Java 8) java.time.*Las clases no parecen tener una manera fácil de construir su propia ZoneIdpartir de un conjunto de reglas. (Tal vez se podría hacer mediante la implementación de su propio ZoneRuleProvider( javadoc ), pero se ve muy complicado.)

Por lo tanto (OMI) que sería mejor de conseguir su sistema operativo para utilizar los identificadores de zona TZDB estándar.


Ha comentado:

En este sistema particular, ni "/ etc / localtime" ni "/ / etc zona horaria" existir.

Si está ejecutando Ubuntu biónica, "/ etc / localtime" debería existir. Debe ser un enlace simbólico a un archivo binario en la zona horaria "/ usr / share / zoneinfo" árbol. Ver https://linuxize.com/post/how-to-set-or-change-timezone-on-ubuntu-18-04/ . O tal vez el problema es que el sistema ha sido configurado deliberadamente para no conocer su zona horaria local.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=229288&siteId=1
Recomendado
Clasificación