2013-07-04 18 views
8

byłem bawić z JodaTime dzisiaj, a ja spodziewałem się tego testu przejść:Dlaczego konwersja Joda DateTime na Kalendarz i powrót zmieniają pole ageOfEra i nic więcej?

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

Ale to się nie powiedzie. Sprawdziłem to pod JodaTime 2.1 i 2.2.

dalszej kontroli (za pomocą SamePropertyValuesAs matcher) pokazuje, że awaria jest spowodowana przez różnicę w nieruchomości centuryOfEra:

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

Więc dlaczego ta zmiana nieruchomość, gdy wszystko inne - rok, miesiąc, dzień, dzień tygodnia, strefa czasowa itp. - czy nie? Czy to błąd? Nie powinieneś być w stanie przemieścić DateTime do kalendarza iz powrotem?

Odpowiedz

1

Joda Time wersja 2.2 ma metodę isEqual który porównuje tylko milise-, natomiast równa porównuje milise-, chronologię i strefę czasową:

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

więc albo chronologii lub strefy czasowej nie są zachowywane przez konwersję do lub z GregorianCalender. Pozostaw komentarz, jeśli chcesz, bym zbadał dalej.

Powiązane problemy