2013-07-04 10 views
8

avrei dovuto vedermela con JodaTime oggi, e mi aspettavo questo test per passare:Perché la conversione di un Date Date Joda in Calendar e viceversa modifica il campo centuryOfEra e nient'altro?

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

ma fallisce. L'ho controllato con JodaTime 2.1 e 2.2.

ulteriori controlli (utilizzando il SamePropertyValuesAs matcher) mostra che il guasto è causato da una differenza nella proprietà centuryOfEra:

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

Allora perchè il questo cambiamento proprietà, quando tutto il resto - anno, mese, giorno, giorno della settimana, fuso orario, ecc. - no? è un insetto? Non dovresti essere in grado di effettuare il roundtrip di un DateTime su un calendario e di tornare indietro?

risposta

1

Joda Time versione 2.2 ha un metodo isEqual che mette a confronto solo il milisecond, uguale, mentre paragona la milisecond, cronologia e fuso orario:

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

Quindi, o la cronologia o il fuso orario non sono conservati la conversione da o verso un GregorianCalender. Lascia un commento se desideri che io approfondisca ulteriormente.

Problemi correlati