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 に答える