No es un error. Es una característica.
Según el javadoc para ZoneId
, esa sintaxis POSIX para especificar zonas no es compatible:
ID de zona horaria
El ID es único dentro del sistema. Hay tres tipos de identificación.
El tipo de identificación más simple es el de ZoneOffset. Esto consiste en 'Z' e ID que comienzan con '+' o '-'.
El siguiente tipo de identificación son las identificaciones de estilo desplazado con algún tipo de prefijo, como 'GMT+2' o 'UTC+01:00'. Los prefijos reconocidos son 'UTC', 'GMT' y 'UT'. El desplazamiento es el sufijo y se normalizará durante la creación. Estos ID se pueden normalizar a ZoneOffset usando normalized().
El tercer tipo de identificación son las identificaciones basadas en regiones. Un ID basado en región debe tener dos o más caracteres y no debe comenzar con 'UTC', 'GMT', 'UT' '+' o '-'. Los ID basados en regiones se definen mediante la configuración, consulte ZoneRulesProvider. La configuración se centra en proporcionar la búsqueda desde el ID hasta las ZoneRules subyacentes.
Las reglas de zona horaria las definen los gobiernos y cambian con frecuencia. Hay una serie de organizaciones, conocidas aquí como grupos, que supervisan los cambios de zona horaria y los cotejan. El grupo predeterminado es la base de datos de zonas horarias de IANA (TZDB). Otras organizaciones incluyen IATA (el organismo de la industria de las aerolíneas) y Microsoft.
Cada grupo define su propio formato para el ID de región que proporciona. El grupo TZDB define ID como 'Europa/Londres' o 'América/Nueva_York'. Las ID de TZDB tienen prioridad sobre otros grupos.
Véase también:
- ¿Zar Var a la zona horaria de Java?
Si escribió algún código para analizar esa sintaxis, debería poder usar los datos para construir un SimpleTimeZone
(javadoc). Desafortunadamente, esto obliga a seguir usando el Date
antiguo ("en su mayoría obsoleto") clase y amigos.
El nuevo (en Java 8) java.time.*
las clases no parecen tener una manera fácil de construir su propio ZoneId
de un conjunto de reglas. (Tal vez podría hacerse implementando su propio ZoneRuleProvider
(javadoc), pero parece complicado.)
Entonces (en mi opinión), sería mejor que su sistema operativo use las identificaciones de zona TZDB estándar.
Has comentado:
En este sistema en particular, no existen ni "/etc/localtime" ni "/etc/timezone".
Si está ejecutando Ubuntu Bionic, debería existir "/etc/localtime". Debe ser un enlace simbólico a un archivo binario de zona horaria en el árbol "/usr/share/zoneinfo". Consulte https://linuxize.com/post/how-to-set-or-change-timezone-on-ubuntu-18-04/. O quizás el problema es que el sistema ha sido configurado deliberadamente para no conocer su zona horaria local.