2009-09-24 12 views
9

Il database contiene dati in UTC e quando cerco di ottenere i datiJava ResultSet come getTimestamp in UTC

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

C'è qualcosa di sbagliato in questo?

+3

Dicci, sei tu a fare la domanda. L'hai provato? Non fornisce risultati che ti aspettavi? Se sì, allora cosa ti aspettavi e quali sono stati i risultati che ha dato? E cosa ti dice il database quando usi il suo strumento di query? – kdgregory

+1

Sì, l'ho provato, sì, non sta dando i risultati che mi aspetto. Il database ha un valore UTC e questo codice aggiunge ulteriormente +8 al valore già esistente nel DB. – kal

+0

Voglio dire +8 ore – kal

risposta

6

L'istanza di DateFormat è molto probabile che mostri il valore in ora locale. Quando si visualizza il tuo valore, dare una prova:

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: al tuo commento:

cosa se uso GMT, vorrei che essere un problema in SimpleDateFormat

SimpleDateFormat può utilizzare i fusi orari generali (GMT +/- n), RFC822 e il testo ("se hanno nomi" come afferma JavaDoc - vedere this post per informazioni sui nomi).

+0

Cosa succede se uso GMT, sarebbe un problema in SimpleDateFormat – kal

+0

vedere le mie modifiche nel post. – akf

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

Questo dovrebbe fare il trucco!

+2

questo dovrebbe essere contrassegnato come la risposta corretta;) – Kirby

+0

Nota che come da documentazione su http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getTimestamp%28int,% 20java.util.Calendar% 29 funzionerà solo se il database sottostante non memorizza le informazioni di timestamp – arahant

+0

@arahant, se il db sottostante memorizza le informazioni sul fuso orario (non sul timestamp), quindi non c'è alcun problema dato che il timestamp sarà nel fuso orario corretto. Il problema è quando il timestamp è memorizzato in UTC senza informazioni sul fuso orario, poiché Java utilizzerà il fuso orario della macchina locale per costruire l'oggetto timestamp. – Paul