Pregunta

Estoy trabajando con webservices, insertar registros, que devuelven un valor de marca de tiempo en XMLGregorianCalendar tipo.Necesito transformar en java.sql.Valor de marca de tiempo, por lo que utilizar una función como esta.

public static java.sql.Timestamp getSqlTimeStamp(XMLGregorianCalendar xgc) {
    if (xgc == null) {
        return null;
    } else {
        return new Timestamp(xgc.toGregorianCalendar().getTime().getTime());
    }
}
Timestamp timestamp=getSqlTimeStamp(ExitInXMLGregor.getTimestamp());

Mi problema es que en el servidor, el valor de marca de tiempo al insertar un registro, se parece a esto:2012-10-03T19:23:22.342+02:00

Pero cuando hago mi tipo de conversión, puedo obtener el valor de marca de tiempo como este:2012-10-03T17:23:22.342

El tiempo en el servidor (donde el webservice se encuentra) es de 2 horas más de mi localidad, y por alguna razón, yo obtener mi insertar hora local, después de transformarla.El problema es que realmente necesito para obtener la hora del servidor, causa en la DB, el valor de marca de tiempo coincide con el servidor, y estoy teniendo problemas en la operación de actualización, debido a los diferentes valores de marca de hora.

Por favor, agradecería cualquier tipo de ayuda.gracias!

Editar:Yo especie de encontrar una solución, pero no es exactamente lo que necesito.Cuando puedo convertir mi marca de tiempo en java.sql.Formato Timestamp en XMLGregorian yo configuración de la zona horaria del servidor (setTimeZone(zona Horaria.getTimeZone (GMT+02:00"))).Esto realmente funciona, pero está lejos de la solución ideal (podría ocurrir que la zona horaria o incluso el servidor de cambio) sería bueno saber que en este punto de la zona horaria del servidor dinámicamente, pero no sé cómo...

public static XMLGregorianCalendar getXMLGregorianCalendar(Timestamp timestamp)
        throws BaseException {
    try {
        GregorianCalendar gc = new GregorianCalendar();
        gc.setTimeZone(TimeZone.getTimeZone("GMT+02:00"));
        gc.setTimeInMillis(timestamp.getTime());
        return DatatypeFactory.newInstance().newXMLGregorianCalendar(gc);
    } catch (DatatypeConfigurationException ex) {
        throw new BaseException(ex);
    }
}
¿Fue útil?

Solución

Sospecho que la marca de tiempo especifica la hora correcta, simplemente no se muestra con la zona horaria correcta. 2012-10-03t17: 23: 22.342 es el mismo que 2012-10-03t19: 23: 22.342 + 02: 00, suponiendo que la zona horaria (oculta) del primero es +00: 00.

Otros consejos

tl;dr

  • Ambas cadenas representan el mismo momento, simplemente se ajustan a una zona horaria a la vez que no nota la desplazamiento de UTC.
  • Evitar tal confusión por siempre incluyendo el desplazamiento y la zona de información en dichas cadenas.
  • La utilización de modernas java.tiempo las clases que sustituye a las problemáticas heredadas de las clases.(Instant, no Timestamp)

Código de ejemplo.

myPreparedStatement.setObject( 
    … , 
    myXMLGregorianCalendar  // If forced to work with a `javax.xml.datatype.XMLGregorianCalendar` object rather than a modern java.time class…
    .toGregorianCalendar()  // …convert to a `java.util.GregorianCalendar`, and then…
    .toZonedDateTime()      // …convert to modern `java.time.ZonedDateTime` class.
    .toInstant()            // Adjust to UTC by extracting an `Instant` object.
)

Recuperar datos de una base de datos, como de JDBC 4.2 y versiones posteriores.

Instant instant = myResultSet.getObject( … , Instant.class ) ;

java.tiempo

Como el correcto aceptado Respuesta por Robert Tupelo-Schneck dice, parece que todo está bien en tanto que las cadenas representan el mismo momento pero ajustado en una zona horaria diferente, con un desplazamiento diferente-de-UTC.El problema es que uno de esos dos cadenas carece de un indicador de su desplazamiento de UTC.

Tal omisión es una mala práctica, ya que crea esta confusión.Siempre incluyen el desplazamiento de UTC a menos que sea absolutamente cierto que el contexto hace que el desplazamiento/zona clara.

Trabajo en UTC

Trabajo en UTC, evita este tipo de confusión.Generalmente las mejores para trabajar, almacenar, y la fecha de intercambio-los valores de hora en UTC.Ajuste de la hora UTC para una zona horaria sólo para su presentación al usuario o cuando sea requerido por la lógica de negocio.

También, usted está utilizando terriblemente molesto edad, las clases que son ahora suplantado por el java.tiempo clases.Convertir su XMLGregorianCalendar a java.time.ZonedDateTime.

ZonedDateTime zdt = myXMLGregorianCalendar.toGregorianCalendar().toZonedDateTime() ;

Ajustar a UTC por la extracción de una Instant objeto.

Instant instant = zdt.toInstant() ;

Como de JDBC 4.2 y versiones posteriores, puede cambiar directamente java.tiempo los objetos con la base de datos.No hay necesidad de utilizar jamás el legado java.sql.Timestamp clase de nuevo.

myPreparedStatement.setObject( … , instant ) ;

Recuperación:

Instant instant = myResultSet.getObject( … , Instant.class ) ;

Ajuste de la hora UTC para algunos en particular de la zona de tiempo si desea ver el mismo momento con la hora del reloj de pared utilizado por la gente de una región en particular.

ZoneId z = ZoneId.of( "Africa/Tunis" ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

Convertir

Si usted debe interactuar con código antiguo que requieren un java.sql.Timestamp, usted puede convertir de ida y vuelta con java.time.Instant.Llame a los nuevos métodos de conversión añadido a la edad, las clases.

java.sql.Timestamp ts = java.sql.Timestamp.from( instant ) ;

Van en la dirección opuesta.

Instant instant = ts.toInstant() ;

Ver también mi Respuesta a una Pregunta similar.


Acerca de java.tiempo

El java.tiempo el marco está construido en Java 8 y versiones posteriores.Estas clases suplantar la problemática de edad legado fecha y hora de las clases, tales como java.util.Date, Calendar, & SimpleDateFormat.

El Joda-El Tiempo el proyecto, ahora en el modo de mantenimiento, asesora de la migración a la java.tiempo clases.

Para obtener más información, consulte el Oracle Tutorial.Y la búsqueda de Desbordamiento de Pila, hay muchos ejemplos y explicaciones.La especificación es JSR 310.

Usted puede intercambiar java.tiempo los objetos directamente con la base de datos.El uso de un Controlador JDBC compatible con JDBC 4.2 o más tarde.No hay necesidad para las cadenas, sin necesidad de java.sql.* clases.

Dónde obtener el java.clases de tiempo?

El ThreeTen-Extra el proyecto se extiende java.tiempo con clases adicionales.Este proyecto es un terreno de prueba para posibles futuras incorporaciones a java.tiempo.Usted puede encontrar algunos de clases útiles aquí, tales como Interval, YearWeek, YearQuarter, y más.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top