Es ist kein Fehler. Es ist eine Funktion.
Laut Javadoc für ZoneId
, dass die POSIX-Syntax zur Angabe von Zonen nicht unterstützt wird:
Zeitzonen-IDs
Die ID ist innerhalb des Systems eindeutig. Es gibt drei Arten von IDs.
Der einfachste ID-Typ ist der von ZoneOffset. Diese besteht aus 'Z' und IDs, die mit '+' oder '-' beginnen.
Der nächste ID-Typ sind IDs im Offset-Stil mit einer Art Präfix, z. B. „GMT+2“ oder „UTC+01:00“. Die erkannten Präfixe sind „UTC“, „GMT“ und „UT“. Der Offset ist das Suffix und wird während der Erstellung normalisiert. Diese IDs können mit normalized() auf einen ZoneOffset normalisiert werden.
Der dritte ID-Typ sind regionsbasierte IDs. Eine regionsbasierte ID muss aus zwei oder mehr Zeichen bestehen und darf nicht mit „UTC“, „GMT“, „UT“, „+“ oder „-“ beginnen. Regionsbasierte IDs werden durch Konfiguration definiert, siehe ZoneRulesProvider. Die Konfiguration konzentriert sich auf die Bereitstellung der Suche von der ID zu den zugrunde liegenden Zonenregeln.
Zeitzonenregeln werden von Regierungen festgelegt und ändern sich häufig. Es gibt eine Reihe von Organisationen, die hier als Gruppen bezeichnet werden, die Zeitzonenänderungen überwachen und zusammenstellen. Die Standardgruppe ist die IANA Time Zone Database (TZDB). Weitere Organisationen sind IATA (der Verband der Luftfahrtindustrie) und Microsoft.
Jede Gruppe definiert ihr eigenes Format für die bereitgestellte Regions-ID. Die TZDB-Gruppe definiert IDs wie „Europe/London“ oder „America/New_York“. TZDB-IDs haben Vorrang vor anderen Gruppen.
Siehe auch:
- TZ-Var in Java-Zeitzone?
Wenn Sie Code geschrieben haben, um diese Syntax zu parsen, sollten Sie in der Lage sein, die Daten zum Erstellen eines SimpleTimeZone
zu verwenden (Javadoc). Leider zwingt dies dazu, weiterhin den alten ("größtenteils veralteten") Date
zu verwenden Klasse und Freunde.
Das neue (in Java 8) java.time.*
Klassen scheinen keine einfache Möglichkeit zu haben, Ihren eigenen ZoneId
zu konstruieren aus einem Regelwerk. (Vielleicht könnte dies durch die Implementierung Ihres eigenen ZoneRuleProvider
erreicht werden (javadoc), sieht aber kompliziert aus.)
Also (IMO) wäre es besser, Ihr Betriebssystem dazu zu bringen, die Standard-TZDB-Zonen-IDs zu verwenden.
Sie haben kommentiert:
Auf diesem speziellen System existieren weder "/etc/localtime" noch "/etc/timezone".
Wenn Sie Ubuntu Bionic ausführen, sollte "/etc/localtime" vorhanden sein. Es sollte ein symbolischer Link zu einer binären Zeitzonendatei im „/usr/share/zoneinfo“-Baum sein. Siehe https://linuxize.com/post/how-to-set-or-change-timezone-on-ubuntu-18-04/. Oder vielleicht liegt das Problem darin, dass das System absichtlich so konfiguriert wurde, dass es seine lokale Zeitzone nicht kennt.