7
ZonedDateTime zdt = ZonedDateTime.of(2015, 10, 18, 0, 30, 0, 0,
    ZoneId.of("America/Sao_Paulo")); 
System.out.println(zdt); // 2015-10-18T01:30-02:00[America/Sao_Paulo]

時間は1に設定されています0が、タイムゾーンは であるのUTC-02:00に対し、夏時間のタイムゾーンは であることがわかりますUTC-03:00

しかし、ここに別の例があります:

ZonedDateTime zdt = ZonedDateTime.of(2015, 10, 18, 0, 30, 0, 0,
    ZoneId.of("America/Los_Angeles"));
System.out.println(zdt); //2015-10-18T00:30-07:00[America/Los_Angeles]

夏時間のタイムゾーンが表示されUTC-07:00、時間は0設定したとおりです。

なぜ違うのですか?

4

2 に答える 2

8

これは、選択した時刻が、ブラジルが夏時間に切り替わる夜の真夜中と 01:00 の間のギャップにあるために発生します。その時間は実際には不可能であるため、ドキュメントに記載されている動作が得られます。

ギャップの場合、クロックが前方にジャンプすると、有効なオフセットはありません。代わりに、ローカルの日時がギャップの長さだけ遅くなるように調整されます。典型的な 1 時間の夏時間の変更の場合、ローカルの日付/時刻は、通常「夏」に対応するオフセットに 1 時間後に移動されます。

3 月の対応する夜の 02:00 から 03:00 の間の時間を選択すると、Los_Angeles ゾーンで同じ動作を観察できます。

zdt = ZonedDateTime.of(2015, 3, 8, 2, 30, 0, 0,
        ZoneId.of("America/Los_Angeles"));
System.out.println(zdt); 
于 2017-06-26T09:35:50.117 に答える