Joda-Time DateTimeZone无法正确比较

时间:2017-11-15 22:17:20

标签: java timezone jodatime

我一直在为使用Joda-Time的项目进行单元测试,我注意到应该代表相同时区的DateTimeZone个实例在equals上没有返回true。特别是,在下面的单元测试中

// should be the same
DateTimeZone WAT = DateTimeZone.forOffsetHours(1); // GMT+01:00
DateTimeZone LAG = DateTimeZone.forID("Africa/Lagos"); // Lagos

DateTime sample = new DateTime(2017, 11, 15, 10, 50);
DateTime dtzWAT = sample.withZoneRetainFields(WAT);
DateTime dtzLAG = sample.withZoneRetainFields(LAG);

@Test public void compareZones() { assertEquals(WAT, LAG); }
@Test public void compareTimes() { assertEquals(dtzWAT, dtzLAG); }

两个测试都失败,即使Africa/LagosGMT+01:00是同一时区,而且两个DateTimes代表同一时刻 - 事实上,下面的两个测试证实了这一点

// both succeed
@Test public void compareStrings() {
    assertEquals(dtzWAT.toString(), dtzLAG.toString()); 
}

@Test public void checkSameTime() { 
    assertFalse(dtzLAG.isBefore(dtzWAT)); 
    assertFalse(dtzWAT.isBefore(dtzLAG)); 
}

为什么会这样?为什么这两个时区实例不相同,而且还有这个呢?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

  

为什么会发生这种情况

DateTimeZone不相等:一个称为Africa/Lagos,另一个称为GMT+01:00。它在the Javadoc of DateTimeZone.equals

中说
  

如果相等则为true,基于ID 和所有内部规则

对于DateTime.equals

  

根据毫秒时刻,年表和时区,将此对象与指定对象进行相等性比较。

时区不相等,因此DateTime s不等。

也许他们有效相等,并不意味着他们实际

请注意,java.util.TimeZone具有hasSameRules(...)方法,这是一个与平等无关的概念。