これはバグではありません。
ZoneId
の javadoc によると 、ゾーンを指定するための POSIX 構文はサポートされていません:
タイムゾーン ID
ID はシステム内で一意です。 ID には 3 種類あります。
最も単純なタイプの ID は、ZoneOffset からの ID です。これは、「Z」と「+」または「-」で始まる ID で構成されます。
次のタイプの ID は、'GMT+2' や 'UTC+01:00' などの何らかの形式のプレフィックスを持つオフセット スタイルの ID です。認識されるプレフィックスは、「UTC」、「GMT」、および「UT」です。オフセットはサフィックスであり、作成中に正規化されます。これらの ID は、normalized() を使用して ZoneOffset に正規化できます。
3 番目のタイプの ID は、地域ベースの ID です。地域ベースの ID は 2 文字以上である必要があり、'UTC'、'GMT'、'UT'、'+'、'-' で始まらないでください。地域ベースの ID は構成によって定義されます。ZoneRulesProvider を参照してください。この構成は、ID から基礎となる ZoneRules への参照を提供することに重点を置いています。
タイム ゾーンのルールは政府によって定義され、頻繁に変更されます。タイム ゾーンの変更を監視し、それらを照合する、ここではグループと呼ばれる組織が多数あります。デフォルトのグループは、IANA タイム ゾーン データベース (TZDB) です。その他の組織には、IATA (航空業界団体) や Microsoft などがあります。
各グループは、提供するリージョン ID の独自の形式を定義します。 TZDB グループは、「Europe/London」や「America/New_York」などの ID を定義します。TZDB ID は他のグループよりも優先されます。
こちらもご覧ください:
- TZ Var から Java タイムゾーンへ?
その構文を解析するコードを書いた場合、データを使用して SimpleTimeZone
を構築できるはずです。 (javadoc)。残念ながら、これは古い (「ほとんど非推奨」) Date
を使い続けることを強制します。 クラスと友達。
新しい (Java 8) java.time.*
クラスには、独自の ZoneId
を構築する簡単な方法がないようです 一連のルールから。 (独自の ZoneRuleProvider
を実装することで実現できるかもしれません (javadoc)、複雑に見えます。)
したがって、(IMO) OS で標準の TZDB ゾーン ID を使用する方がよいでしょう。
コメントしました:
<ブロック引用>この特定のシステムには、「/etc/localtime」も「/etc/timezone」も存在しません。
Ubuntu Bionic を実行している場合、「/etc/localtime」が存在するはずです。 「/usr/share/zoneinfo」ツリー内のバイナリ タイムゾーン ファイルへのシンボリック リンクである必要があります。 https://linuxize.com/post/how-to-set-or-change-timezone-on-ubuntu-18-04/ を参照してください。あるいは、ローカル タイムゾーンを認識しないようにシステムが意図的に構成されていることが問題なのかもしれません。