Ce n'est pas un bogue. C'est une fonctionnalité.
Selon le javadoc pour ZoneId
, que la syntaxe POSIX pour spécifier les zones n'est pas prise en charge :
ID de fuseau horaire
L'ID est unique dans le système. Il existe trois types d'identifiants.
Le type d'ID le plus simple est celui de ZoneOffset. Il se compose de 'Z' et d'identifiants commençant par '+' ou '-'.
Le prochain type d'identifiant sont des identifiants de style décalé avec une forme de préfixe, comme 'GMT+2' ou 'UTC+01:00'. Les préfixes reconnus sont 'UTC','GMT' et 'UT'. Le décalage est le suffixe et sera normalisé lors de la création. Ces identifiants peuvent être normalisés en un ZoneOffset à l'aide de normalized().
Le troisième type d'ID sont les ID basés sur la région. Un ID basé sur la région doit être composé de deux caractères ou plus et ne pas commencer par 'UTC', 'GMT', 'UT' '+' ou '-'. Les ID basés sur la région sont définis par la configuration, voirZoneRulesProvider. La configuration se concentre sur la fourniture de la recherche de l'ID aux règles de zone sous-jacentes.
Les règles de fuseau horaire sont définies par les gouvernements et changent fréquemment. Il existe un certain nombre d'organisations, appelées ici des groupes, qui surveillent les changements de fuseau horaire et les rassemblent. Le groupe par défaut est la base de données des fuseaux horaires IANA (TZDB). D'autres organisations incluent l'IATA (l'organisme de l'industrie du transport aérien) et Microsoft.
Chaque groupe définit son propre format pour l'ID de région qu'il fournit. Le groupe TZDB définit des identifiants tels que "Europe/Londres" ou "Amérique/New_York". Les identifiants TZDB ont priorité sur les autres groupes.
Voir aussi :
- Varie TZ vers fuseau horaire Java ?
Si vous avez écrit du code pour analyser cette syntaxe, vous devriez pouvoir utiliser les données pour construire un SimpleTimeZone
(javadoc). Malheureusement, cela oblige à continuer à utiliser l'ancien Date
("généralement obsolète") classe et amis.
Le nouveau (en Java 8) java.time.*
les classes ne semblent pas avoir un moyen facile de construire votre propre ZoneId
à partir d'un ensemble de règles. (Peut-être que cela pourrait être fait en implémentant votre propre ZoneRuleProvider
(javadoc), mais ça a l'air compliqué.)
Donc (IMO), vous feriez mieux de faire en sorte que votre système d'exploitation utilise les identifiants de zone TZDB standard.
Vous avez commenté :
Sur ce système particulier, ni "/etc/localtime" ni "/etc/timezone" n'existent.
Si vous utilisez Ubuntu Bionic, "/etc/localtime" devrait exister. Il doit s'agir d'un lien symbolique vers un fichier de fuseau horaire binaire dans l'arborescence "/usr/share/zoneinfo". Voir https://linuxize.com/post/how-to-set-or-change-timezone-on-ubuntu-18-04/. Ou peut-être que le problème est que le système a été délibérément configuré pour ne pas connaître son fuseau horaire local.