CET
疑似ゾーンです
EST
またはなどの 2 ~ 4 文字の略語は決して使用しないでください。それらIST
は実際のタイム ゾーンではなく、標準化されておらず、一意でさえありません (!)。
Continent/Region
、、、などの適切なタイム ゾーン名を の形式で指定します。Continent/Region
America/Montreal
Africa/Casablanca
Pacific/Auckland
おそらく、CET
実際にはEurope/Luxembourg
やなどのタイムゾーンを意味していますEurope/Gibraltar
。
ZoneId zoneId = ZoneId.of( "Europe/Gibralter" ) ;
このTimeZone
クラスは現在レガシーであり、初期バージョンの Java にバンドルされていた恐ろしい日時クラスの一部です。代わりに最新のjava.timeクラスのみを使用してください。
適切な名前は DST に合わせて調整されます
このプログラムは定期的に再起動されないため (これはサーバーです)、冬から夏に切り替えるとどうなるのだろうと思っていました。
上記のように適切な名前を使用し、JVM インストールでtzdataデータ ファイルを最新の状態に保つと、使用時に夏時間 (DST) カットオーバーが自動的に処理されますZonedDateTime
。
ZonedDateTime zdt = ZonedDateTime.now() ; // Omitting the optional `ZoneId` argument means the JVM’s current default time zone is implicitly applied, looking up the current offset in use at this moment for the JVM's current default time zone.
3 月 29 日の午前 2 時に、2020 年春の DST カットオーバー中に何が起こるか見てみましょう。時刻は午前 2 時 1 分前です。次に、1 分追加します。DST のウォールクロック時間の「スプリングアヘッド」調整により、時刻が午前 2 時ではなく午前 1 時 59 分から午前 3 時にジャンプすることに注意してください。
ZoneId z = ZoneId.of( "Europe/Gibraltar" ) ;
ZonedDateTime zdt = ZonedDateTime.of( 2020 , 3 , 29 , 1 , 59 , 0 , 0 , z ) ;
ZonedDateTime zdtMinuteLater = zdt.plusMinutes( 1 ) ; // Notice how the time-of-day jumps to 3 AM rather than 2 AM.
コンソールにダンプします。
System.out.println( "zdt.toString(): " + zdt ) ;
System.out.println( "zdtMinuteLater.toString(): " + zdtMinuteLater ) ;
IdeOne.com でこのコードのライブ実行を参照してください。
zdt.toString(): 2020-03-29T01:59+01:00[ヨーロッパ/ジブラルタル]
zdtMinuteLater.toString(): 2020-03-29T03:00+02:00[ヨーロッパ/ジブラルタル]
デフォルトに頼らない
JVM の現在のデフォルト タイム ゾーンに依存しないようにコードを記述できます。
前に示したコード行 ( ZonedDateTime.now()
) は、私が推奨するものではありません。ZoneId
その行では、オプションの引数が省略されています。代わりに、希望する/予想されるタイムゾーンを常に渡すことをお勧めします。
ZoneId zoneId = ZoneId.of( "Europe/Gibralter" ) ;
ZonedDateTime zdtGibralter = ZonedDateTime.now( zoneId ) ;