9

Joda Timeでは、DateTimeZone.isLocalDateTimeGapメソッドを使用して、春先の夏時間への移行によって作成されたギャップに該当するため、ローカルの日付と時刻が無効であるかどうかを簡単に判断できます。

DateTimeZone zone = DateTimeZone.forID("America/New_York");
LocalDateTime ldt = new LocalDateTime(2013, 3, 10, 2, 0);
boolean inGap = zone.isLocalDateTimeGap(ldt);  // true

しかし、フォールバック遷移をどのように検出するのでしょうか? 言い換えれば、重複があるためにローカルの日付と時刻があいまいになる可能性がある場合、それをどのように検出しますか? のようなものを期待しますがzone.isLocalDateTimeOverlap、存在しません。もしそうなら、私はそれを次のように使用します:

DateTimeZone zone = DateTimeZone.forID("America/New_York");
LocalDateTime ldt = new LocalDateTime(2013, 11, 3, 1, 0);
boolean overlaps = zone.isLocalDateTimeOverlap(ldt);  // true

Joda-Time のドキュメントでは、変換中にオーバーラップが発生した場合、別段の指示がない限り、以前の可能性が採用されることは明らかです。しかし、その動作を検出する方法については述べていません。

4

1 に答える 1

11

withEarlierOffsetAtOverlap()を活用する

public static boolean isInOverlap(LocalDateTime ldt, DateTimeZone dtz) {
    DateTime dt1 = ldt.toDateTime(dtz).withEarlierOffsetAtOverlap();
    DateTime dt2 = dt1.withLaterOffsetAtOverlap();
    return dt1.getMillis() != dt2.getMillis();
}


public static void test() {
    // CET DST rolls back at 2011-10-30 2:59:59 (+02) to 2011-10-30 2:00:00 (+01)
    final DateTimeZone dtz = DateTimeZone.forID("CET");
    LocalDateTime ldt1 = new LocalDateTime(2011,10,30,1,50,0,0); // not in overlap
    LocalDateTime ldt2 = new LocalDateTime(2011,10,30,2,50,0,0); // in overlap
    System.out.println(ldt1 + " is in overlap? " + isInOverlap(ldt1, dtz)); 
    System.out.println(ldt2 + " is in overlap? " + isInOverlap(ldt2, dtz)); 
}
于 2013-09-13T20:07:15.580 に答える