2016-10-12 15 views
4

Java 8時間APIでは、秋(中部ヨーロッパ時間)のDST時間変更中に時間の重複に該当するLocalDateTimeを作成できます。Java 8時間APIでDST変更期間のオフセットを選択する方法

ZoneIdを使用して正確な瞬間を表すZonedDateTimeに変換することができます。

これを実行しても実際にはあいまいさは解消されません。このLocalDateTimeとこのゾーンに対応する2つの瞬間が存在する可能性があります(オフセットは異なります)。

時間APIがサマーオフセットを選択する方法と理由(参照歓迎)はなぜですか?

@Test 
public void TimeSetOnDST() throws Exception { 
    LocalDateTime time = LocalDateTime.of(2016, 10, 30, 2, 30); // in the DST time overlap 
    ZonedDateTime of = ZonedDateTime.of(time, ZoneId.of("Europe/Zurich")); 
    System.out.println(of); // 2016-10-30T02:30+02:00[Europe/Zurich] 
    // But why not 2016-10-30T02:30+01:00[Europe/Zurich] ? 
    // Is this just "by convention"? 
} 

答えて

3

これはよくjavadocに記載されます:ほとんどのケースで

、唯一の有効なローカル日時のオフセットがあります。オーバーラップの場合、クロックが戻されるとき、2つの有効なオフセットがある。このメソッドは、通常 "summer"に対応する以前のオフセットを使用します。

@JodaStephenのコメントに記載されているように、使用可能な他のオフセットを選択する場合は、the withLaterOffsetAtOverlap methodを使用できます。

+0

ありがとうございました。私はちょうどその後の大会によると思います。 – Philipp

+3

規約を変更する場合は、単に['withLaterOffsetAtOverlap()'](http://docs.oracle.com/javase/8/docs/api/java/time/ZonedDateTime.html#withLaterOffsetAtOverlap--)を使用してください。 (大部分のユースケースでは例外または追加のパラメータよりも優れているため、大会が選ばれました) – JodaStephen

+0

私はその慣習を賢明に選んだと感じます。 'LocalDateTime' docはそれが「ウォールクロック」だと言っており、DSTシフト後の朝起きるときに私たちが想定している通りにコンベンションが行われています:) –

関連する問題