2012-10-12 17 views
7

Próbuję przekonwertować z milisekundowej sygnatury czasowej na XMLGregorianCalendar iz powrotem, ale wydaje się, że otrzymuję złe wyniki. czy robię coś źle? Wygląda na to, że zyskuję kilka dni.Long To XMLGregorianCalendar i wróć do Long

// Time stamp 01-Jan-0001 00:00:00.000 
    Long ts = -62135740800000L; 
    System.out.println(ts); 
    System.out.println(new Date(ts)); // Sat Jan 01 00:00:00 PST 1 .. Cool! 

    // to Gregorian Calendar 
    GregorianCalendar gc = new GregorianCalendar(); 
    gc.setTimeInMillis(ts); 

    // to XML Gregorian Calendar 
    XMLGregorianCalendar xc = DatatypeFactory.newInstance().newXMLGregorianCalendar(gc); 

    // back to GC 
    GregorianCalendar gc2 = xc.toGregorianCalendar(); 

    // to Timestamp 
    Long newTs = gc2.getTimeInMillis(); 
    System.out.println(newTs); // -62135568000000 .. uh? 
    System.out.println(new Date(newTs)); // Mon Jan 03 00:00:00 PST 1 .. where did the extra days come from? 

Odpowiedz

0

Uważam, że tutaj jest problem. Zgodnie z dokumentacją, toGregorianCalendar() opiera się na GregorianCalendar odpowiednich wartościach domyślnych dla konwersji, gdy brakuje jakiegoś pola.

Jeśli spróbujesz:

Date date = new Date(); 
long ts = date.getTime(); //in place of your input 

i uruchomić swój kod, należy znaleźć, zarówno to i from konwersji działa poprawnie.

Jeśli chcesz, aby Twój toGregorianCalendar() z niestandardowym dostarczaniem danych wejściowych, jak w twoim przykładzie, użyj toGregorianCalendar(TimeZone,Locale,Defaults) i podaj zaktualizowane wartości domyślne, które będą używane podczas konwersji.

3

Interesujące - działa dobrze dla wartości do (około) -10000000000000L (i wartości dodatnich), ale większe wartości ujemne stają się niespójne.

Jeśli wydrukować gc, xc i gc2, można zobaczyć, gdzie pojawia się problem (konwersji z XMLGregorianCalendar na kalendarz gregoriański

gc: java.util.GregorianCalendar[time=-62135740800000 ... DAY_OF_WEEK=7 
xc: 0001-01-01T08:00:00.000Z 
gc2: java.util.GregorianCalendar[time=? ... DAY_OF_WEEK=5 

Jeśli wydrukować dziedzinach xc, masz 1,1 , 1.

System.out.println(xc.getYear()); 
    System.out.println(xc.getMonth()); 
    System.out.println(xc.getDay()); 

Dla gc2, masz 1,0,1 (co odpowiada xc, ponieważ miesiąc są zera w kalendarz gregoriański)

System.out.println(gc2.get(gc2.YEAR)); 
    System.out.println(gc2.get(gc2.MONTH)); 
    System.out.println(gc2.get(gc2.DAY_OF_MONTH)); 

Jednak dodanie tych 3 println połączeń zmienia wyjście z drukowania gc2! - wyjście time=? z gc2 zmienia się na time=-62135568000000 - więc niektóre obliczenia zostały wywołane przez zapytanie do obiektu GregorianCalendar; Właściwość areFieldsSet również zmienia się z false na true.

Strefy czasowe dwóch Kalendarzy Gregoriańskich są różne, ale nie uwzględnia to błędu, który utrzymuje się, nawet jeśli ustawiono wyraźne strefy czasowe i ustawienia regionalne.

+0

Jeśli dodaję 'gc2.get (GregorianCalendar.YEAR);' wtedy dzień jest poprawny, ale teraz ROK jest wyłączony przez 1969 rok. –

+0

To dziwne - nie widzę tego! Dzień się nie udaje, a rok jest jeszcze 1. Zastanawiam się, czy to zależy od wersji Java (używam 1.6.0_27) czy Locale (jestem 'en_GB') .. ??? – DNA