8

我今天在玩 JodaTime,我希望这个测试能够通过:

@Test
public void dateTimeShouldRoundTrip() {
  DateTime originalDateTime = new DateTime(2013, 7, 4, 0, 0);
  DateTime roundTrip = new DateTime(originalDateTime.toGregorianCalendar());
  assertThat(roundTrip, is(originalDateTime));
}

但它失败了。我在 JodaTime 2.1 和 2.2 下都检查过。

进一步检查(使用SamePropertyValuesAs匹配器)表明失败是由centuryOfEra属性差异引起的:

originalDateTime.getCenturyOfEra(); // 20
roundTrip.getCenturyOfEra(); // 21

那么为什么这个属性会发生变化,而其他一切——年、月、日、星期几、时区等——却没有?这是一个错误吗?您不应该能够将 DateTime 往返于 Calendar 并再次返回吗?

4

1 回答 1

1

Joda Time 2.2 版有一个isEqual方法,它只比较毫秒,而 equals 比较毫秒、年表和时区:

DateTime d = new DateTime();
new DateTime(d.toGregorianCalendar()).isEqual(d); // returns true
new DateTime(d.toGregorianCalendar()).equals(d); // returns false, as you observed

因此,与GregorianCalender之间的转换不会保留年表或时区。如果您希望我进一步调查,请发表评论。

于 2013-07-04T05:44:06.200 回答