2009-09-24 16 views
9

La base de datos tiene datos en la hora UTC y cuando trato de obtener datosJava ResultSet cómo getTimestamp en UTC

java.util.Calendar cal = Calendar.getInstance(); 
cal.setTimeZone(TimeZone.getTimeZone("UTC")); 
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME); 
cal.setTime(ts); 

¿Hay algo malo en esto?

+3

Díganos, usted es quien hace la pregunta. ¿Realmente lo has intentado? ¿No da los resultados que esperabas? En caso afirmativo, ¿qué esperabas y cuáles fueron los resultados que dio? ¿Y qué le dice la base de datos cuando usa su propia herramienta de consulta? – kdgregory

+1

Sí, lo probé, sí, no está dando los resultados que esperaba. La base de datos tiene un valor UTC y este código agrega +8 al valor ya existente en DB. – kal

+0

Me refiero a +8 horas – kal

Respuesta

6

Es muy probable que su instancia de DateFormat muestre el valor en la hora local. Cuando se muestra su valor, le daría prueba:

java.util.Calendar cal = Calendar.getInstance(); 
cal.setTimeZone(TimeZone.getTimeZone("UTC")); 
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME); 
cal.setTime(ts); 

SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss z"); 
sdf.setTimeZone(TimeZone.getTimeZone("UTC")); 
System.out.println(sdf.format(cal.getTime())); 

EDIT: a tu comentario:

Qué pasa si uso GMT, tendría que ser un problema en SimpleDateFormat

SimpleDateFormat puede utilice las zonas horarias generales (GMT +/- n), RFC822 y texto ("si tienen nombres" como los estados de JavaDoc - consulte this post para obtener información sobre los nombres).

+0

¿Qué pasa si uso GMT? ¿Sería un problema en SimpleDateFormat – kal

+0

ver mis ediciones en la publicación? – akf

24
java.util.Calendar cal = Calendar.getInstance(); 
cal.setTimeZone(TimeZone.getTimeZone("UTC")); 
java.sql.Timestamp ts = resultSet.getTimestamp(PUBLISH_TIME, cal); 

¡Esto debería hacer el truco!

+2

esto se debe marcar como la respuesta correcta;) – Kirby

+0

Tenga en cuenta que según la documentación en http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getTimestamp%28int,% 20java.util.Calendar% 29 esto funcionará solo si la base de datos subyacente no almacena información de marca de tiempo – arahant

+0

@arahant, si el db subyacente almacena información de zona horaria (no marca de tiempo), entonces no hay problema ya que la marca de tiempo estará en la zona horaria correcta. El problema es cuando la marca de tiempo se almacena en UTC sin información de zona horaria, ya que Java usará la zona horaria de la máquina local para construir el objeto de marca de tiempo. – Paul

Cuestiones relacionadas