2012-10-12 112 views
7

Estoy tratando de convertir la marca de tiempo de milisegundos en XMLGregorianCalendar y viceversa, pero parece que estoy obteniendo resultados incorrectos. ¿Estoy haciendo algo mal? Parece que estoy ganando días.Largo a XMLGregorianCalendar y de regreso a 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? 

Respuesta

0

Creo que este es el problema. Según la documentación, toGregorianCalendar() se basa en los valores predeterminados correspondientes de GregorianCalendar para la conversión cuando falta algún campo.

Si intenta:

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

y ejecutar su código, que debe encontrar, ambos funcionando bien y tofrom conversión.

Si desea su toGregorianCalendar() con entradas de suministro personalizado como en su ejemplo, utilice toGregorianCalendar(TimeZone,Locale,Defaults) y proporcione los valores predeterminados actualizados para usar en la conversión.

3

Interesante - funciona bien para valores hasta (aproximadamente) -10000000000000L (y valores positivos) pero los valores negativos más grandes se vuelven inconsistentes.

Si imprime gc, xc y gc2, se puede ver donde surge el problema (la conversión de XMLGregorianCalendar a GregorianCalendar

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 

Si imprime los campos de xc, se obtiene 1,1 , 1.

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

Para gc2, se obtiene 1,0,1 (que coincide con xc, debido meses están basadas en cero en GregorianCalendar)

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

Sin embargo, la adición de estos 3 println llamadas cambia la salida de impresión de gc2! - La salida time=? de gc2 cambia a time=-62135568000000 - por lo que se activó algún cálculo al consultar el objeto GregorianCalendar; la propiedad areFieldsSet también cambia de false a true.

Las zonas horarias de los dos calendarios Gregorian son diferentes, pero esto no explica el error, que persiste incluso si configura TimeZone y Locale explícitos.

+0

Si agrego 'gc2.get (GregorianCalendar.YEAR);' entonces el día es correcto, pero ahora el AÑO está desactivado en 1969 años. –

+0

Eso es extraño. ¡No veo eso! El día sigue siendo incorrecto y el año sigue siendo 1. Me pregunto si depende de la versión de Java (estoy usando 1.6.0_27) o la configuración regional (estoy 'en_GB') .. ??? – DNA