如何在 Joda Time 中检测模糊的 DST 重叠?

Posted

技术标签:

【中文标题】如何在 Joda Time 中检测模糊的 DST 重叠?【英文标题】:How to detect an ambiguous DST overlap in Joda Time? 【发布时间】:2013-09-18 13:26:44 【问题描述】:

在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 文档清楚地表明,如果在转换过程中存在重叠,除非另有说明,否则它将采用较早的可能性。但它没有说明如何检测这种行为。

【问题讨论】:

【参考方案1】:

利用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)); 

【讨论】:

以上是关于如何在 Joda Time 中检测模糊的 DST 重叠?的主要内容,如果未能解决你的问题,请参考以下文章

org.joda.time |夏令时 (DST) 和本地时区偏移

如何在没有 Joda Time 的情况下在 Java 7 中正确处理夏令时?

Joda-Time、夏令时更改和日期时间解析

Joda-Time 中两个日期之间的天数

如何从 org.joda.time.DateTime 转换为 java.time.ZonedDateTime

如何将 Joda-Time 与 java.sql.Timestamp 一起使用