【问题标题】:Joda-Time DateTimeZone not comparing correctlyJoda-Time DateTimeZone 比较不正确
【发布时间】:2017-11-15 22:17:19
【问题描述】:

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

为什么会这样?为什么这两个时区实例不相等,并且无论如何都存在这个问题?任何帮助将不胜感激。

【问题讨论】:

  • “有什么办法可以解决这个问题”你真正想解决什么问题?
  • @AndyTurner 我需要一种方法来使 DateTime 实例相等。我知道它们实际上是平等的,但我需要在 equals 方法中反映这一点。
  • 但在什么意义上相等?如果你想确保它们引用的是同一时刻(与 Unix 纪元相同的偏移量),请使用 .toInstant() 将它们转换为 Instant,然后进行比较(或使用 !a.isAfter(b) && !b.isAfter(a);或 a.compareTo(b) == 0,但请注意与equals不一致)。

标签: java timezone jodatime


【解决方案1】:

为什么会这样

DateTimeZones 不相等:一个叫Africa/Lagos,另一个叫GMT+01:00。上面写着the Javadoc of DateTimeZone.equals

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

对于DateTime.equals

根据毫秒瞬间、年表和时区将此对象与指定对象进行比较。

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

也许它们实际上相等,并不意味着它们实际上相等。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 2015-06-14
    • 1970-01-01
    相关资源
    最近更新 更多