乔达时间日期时区未正确比较



我一直在使用 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)); 
}

为什么会这样?为什么两个时区实例不等效,这到底有没有?任何帮助将不胜感激。

为什么会这样

DateTimeZone不相等:一个叫Africa/Lagos,一个叫GMT+01:00。它在DateTimeZone.equals的Javadoc中说

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

对于DateTime.equals

根据

毫秒时刻、时间顺序和时区将此对象与指定的对象进行比较,以实现相等。

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

也许他们实际上是平等的

,并不意味着他们实际上是平等的

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

相关内容

  • 没有找到相关文章

最新更新