2009-09-24 8 views
9

La base de données contient des données UTC et lorsque je tente d'obtenir des donnéesJava ResultSet comment getTimestamp UTC

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

Y at-il quelque chose de mal avec cela?

+3

Vous nous dites, vous êtes celui qui pose la question. Avez-vous réellement essayé? Cela ne donne-t-il pas les résultats que vous attendiez? Si oui, qu'attendez-vous et quels ont été les résultats? Et que vous dit la base de données lorsque vous utilisez son propre outil de requête? – kdgregory

+1

Oui je l'ai essayé, oui ça ne donne pas les résultats que j'attends. La base de données a une valeur UTC et ce code ajoute en outre +8 à la valeur déjà existante dans DB. – kal

+0

Je veux dire +8 heures – kal

Répondre

6

Votre instance DateFormat affiche très probablement la valeur en heure locale. Lors de l'affichage de votre valeur, pour cette solution:

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: à votre commentaire:

Et si j'utilise GMT, serait-ce un problème dans SimpleDateFormat

SimpleDateFormat peut utilisez les fuseaux horaires généraux (GMT +/- n), RFC822 et le texte ("s'ils ont des noms" en tant qu'états JavaDoc - voir this post pour plus d'informations sur les noms).

+0

Que faire si j'utilise GMT, ce serait un problème dans SimpleDateFormat – kal

+0

voir mes modifications dans la publication. – akf

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

Cela devrait faire l'affaire!

+2

cela devrait être marqué comme la bonne réponse;) – Kirby

+0

Notez que selon la documentation à http://docs.oracle.com/javase/6/docs/api/java/sql/ResultSet.html#getTimestamp%28int,% Cela ne fonctionnera que si la base de données sous-jacente ne stocke pas les informations d'horodatage – arahant

+0

@arahant, si la base de données sous-jacente stocke des informations de fuseau horaire (pas d'horodatage) alors il n'y aura pas de problème car l'horodatage sera dans le bon fuseau horaire. Le problème est lorsque l'horodatage est stocké dans UTC sans informations de fuseau horaire, car Java utilisera le fuseau horaire de la machine locale pour construire l'objet timestamp. – Paul

Questions connexes