2009-10-02 20 views
7

que tienen una columna JDBC Date, que si ai utilizar getDate es llegar a la parte 'fecha' sólo 02 Oct 2009 pero si uso getTimestamp tengo la plena 'fecha' 02 de octubre de 2009 13: 56: 78: 890. Esto es excatly lo que quiero.JDBC de marca de hora y fecha GMT emite

Sin embargo, la 'fecha' devuelta por getTimestamp 'ignora' los valores GMT, suponga la fecha; 02 Oct 2009 13: 56: 78: 890, me acaban de conseguir 02 Oct 2009 15: 56: 78: 890

Mi fecha en que se guarda como una fecha + 2GMT en la base de datos, pero el servidor de aplicaciones es en GMT es decir, 2 horas detrás

Cómo todavía puede obtener mi cita como es, 02 Oct 2009 13: 56: 78: 890

Editar

consigo la fecha 2 en el lado del cliente que está en GMT +2

Respuesta

12

Esa es la diferencia entre Timestamp y otros tipos temporales en MySQL. Timestamp se guarda como Unix time_t en UTC, pero otros tipos almacenan fecha/hora literalmente sin información de zona.

Cuando llama a getTimestamp(), el controlador JDBC de MySQL convierte el tiempo de GMT a la zona horaria predeterminada si el tipo es la marca de tiempo. No realiza tal conversión para otros tipos.

Puede cambiar el tipo de columna o realizar la conversión usted mismo. Recomiendo el enfoque anterior.

+0

palabra clave ** ** convierte, por lo que me sale de los +2 horas – n002213f

+0

estoy confundido, si la conversión está funcionando adecuadamente, no se debe ver una fecha que es de menos de 2 horas, en lugar de más ? – wds

+0

@wds - revisar mi edición y la respuesta – n002213f

4

Debe tener en cuenta que java.util.Date (y también java.sql.Date y java.sql.Timestamp, que son subclases de java.util.Date) no sabe nada acerca de las zonas horarias, o más bien, que siempre están en GMT.

java.util.Date y sus subclases no son más que un contenedor para un valor de "número de milisegundos desde 01-01-1970, 12:00 AM UTC".

Para mostrar una fecha en una zona horaria específica, conviértala en una cadena utilizando un objeto java.text.DateFormat. Establezca la zona horaria en ese objeto llamando al método setTimeZone(). Por ejemplo:

Date date = ...; // wherever you get this from 

DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

// Make the date format show the date in CET (central European time) 
df.setTimeZone(TimeZone.getTimeZone("CET")); 

String text = df.format(date); 
0

De esta post he llegado a la conclusión de que JDBC hace recuperar la zona horaria para la marca de tiempo (no creo que el apoyo de MS SQL esto así, la mayoría de los resultados de Google apunta a Oracle)

Cuando el JDBC getTimestamp método se llama solo obtiene la parte 'milisegundos' y crea un objeto Date con el servidor TimeZone, que es GMT.

Cuando este objeto Fecha se presenta a mi cliente que es +2 GMT, agrega 2 horas, que es el desplazamiento estándar que lleva a las horas adicionales.

He corregido esto eliminando el desplazamiento de tiempo de la fecha que recupero, es decir, convertido a la verdadera fecha GMT.

3

Me encontré con un problema similar el otro día donde el componente de tiempo se estaba truncando desde algunas fechas.

Hemos reducido a una diferencia en las versiones de Oracle Driver.

El FAQ de Oracle hay una sección acerca de esto:


select sysdate from dual; ...while(rs.next()) 

Antes de 9201, este volverá: getObject para sysdate: java.sql.Timestamp < < < < getDate para sysdate : java.sql.Date getTimetamp para sysdate: java.sql.Timestamp

A partir de 9201 en adelante, se aplicará el siguiente urned

getObject para sysdate: java.sql.Date < < < < < getDate para sysdate: java.sql.Date >> ningún cambio getTimetamp para sysdate: java.sql.Timestamp >> ningún cambio

Nota: java.sql.Date no tiene una porción de tiempo mientras que java.sql.Timestamp sí.

Con este cambio en el mapeo de tipos de datos, algunas aplicaciones fallarán y/o generarán resultados incorrectos cuando el controlador JDBC se actualice de 8i/9iR1 a 920x controlador JBDC. Para mantener la compatibilidad y mantener las aplicaciones funcionando después de la actualización, se proporcionó un indicador de compatibilidad. Los desarrolladores ahora tienen algunas opciones:

  1. Utilice la bandera oracle.jdbc.V8Compatible.

JDBC Driver no detecta la versión de la base de datos de manera predeterminada. Para cambiar el indicador de compatibilidad para el manejo de los tipos de datos timestamp, propiedad de conexión

'oracle.jdbc.V8Compatible'

se puede ajustar a 'verdadero' y el conductor se comporta como se comportó en 8i, 901x, 9 200 (con respecto a TIMESTAMPs).

De forma predeterminada, el indicador se establece en 'falso'. En el constructor de OracleConnection, el controlador obtiene la versión del servidor y establece la bandera de compatibilidad de forma adecuada.

java.util.Properties prop=newjava.util.Properties(); 
prop.put("oracle.jdbc.V8Compatible","true"); 
prop.put("user","scott"); 
prop.put("password","tiger"); 
String url="jdbc:oracle:thin:@host:port:sid"; 
Connection conn = DriverManager.getConnection(url,prop); 

Con JDBC 10.1.0.x, en lugar de la propiedad de conexión, la siguiente propiedad del sistema se puede utilizar: java -Doracle.jdbc.V8Compatible = true ..... Nota: Esta bandera es un cliente única bandera que rige la asignación de marcas de tiempo y fecha. No afecta ninguna característica de la base de datos.

'2. Utilice set/getDate y set/getTimestamp al tratar con el tipo de datos de columna Fecha y Hora.

El servidor 9i admite los tipos de columna Fecha y Marca de tiempo DATE se asigna a java.sql.Date y TIMESTAMP se mapea a java.sql.Timestamp.


Así que para mi situación, tuve código como este:

import java.util.Date; 
Date d = rs.getDate(1); 

Con 9i que era conseguir una java.sql.Timestamp (que es una subclase de java.util.Date) así que todo era maravilloso y tenía mis horas y minutos.

Pero con 10g, el mismo código ahora obtiene un java.sql.Date (también una subclase de java.util.Date por lo que aún se compila) pero el HH: MM está TRUNCADO.

La segunda solución es bastante fácil para mí - simplemente reemplazar el getDate con getTimestamp y que debe estar bien. Supongo que fue un mal hábito.

+0

gracias por que uno de Jim, lo más apreciado. – n002213f

0
private Date convertDate(Date date1) throws ParseException { 
     SimpleDateFormat sdfFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     String dateStr = sdfFormatter.format(date1); 
     SimpleDateFormat sdfParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     sdfParser.setTimeZone(TimeZone.getTimeZone("GMT")); 
     return sdfParser.parse(dateStr); 
    }