2012-07-31 6 views
1

J'ai un champ de type datetime some_field dans une base de données MySQL. Je peux interroger les données en utilisant recordSet.getTimestamp("somefield"), qui renvoie un objet java.sql.Timestamp. Cependant, les valeurs renvoyées stockent une heure UTC. Maintenant, si le fuseau horaire est "Amérique/Chicago", comment puis-je convertir l'heure. Je dois prendre soin de l'heure d'été.MySQL, Java et TimeZone

+0

Peut-être que je devrais utiliser 'getString()' au lieu de 'getTimestamp()'. L'API datetime de Java pue. –

Répondre

1

Je pense que vous devrez peut-être ignorer la précision inférieure à la milliseconde de Timestamp - ce qui est probablement raisonnable, comme si vous convertissiez dans un fuseau horaire particulier, ce qui suggère qu'il s'agit d'une date «humaine». Quoi qu'il en soit:

TimeZone zone = TimeZone.getTimeZone("America/Chicago"); 
Calendar calendar = Calendar.getInstance(zone); // Also locale? 
calendar.setTime(timestamp); 

Maintenant, vous pouvez demander au calendrier pour ce que vous voulez valeurs - la date, l'heure de la journée, etc.

Alternativement, vous voudrez peut-être envisager d'utiliser Joda Time, ce qui est une bien meilleure date/heure API:

DateTimeZone zone = DateTimeZone.forID("America/Chicago"); 
DateTime dateTime = new DateTime(timestamp.getTime(), zone); 
+0

Problème ... Maintenant, dans la base de données, j'ai un temps '2012-07-31 16:00:00' et le fuseau horaire est 'Timezone.getTimeZone (" US/Eastern ")'. Mais le 'calendar.get (Calendar.HOUR_OF_DAY)' est 17. Je pense que c'est parce que le tz de mon serveur est "US/Central"? Que dois-je faire? –

+0

@seanhawk: Vous devez déterminer avec certitude la valeur exacte renvoyée au code Java. Si vous imprimez 'timestamp.getTime()', que montre-t-il? (Je ne serai pas en mesure d'aider jusqu'à demain, mais je vais jeter un oeil alors.) –

+0

Quand l'heure est à "2012-07-31 20:22:03" et fuseau horaire est "US/Pacifique", 'horodatage .getTime() 'est 1343784123000, qui est" mer, 01 août 2012 01:22:03 GMT "(voir www.onlineconversion.com/unix_time.htm). Cela signifie 'resultSet.getTimestamp()' traite le résultat comme s'il se trouvait dans le fuseau horaire du serveur de l'application, qui est "US/Central" dans mon cas. BTW, 'resultSEt.getTimestamp (key, cal)' obtient exactement la même chose 'Timestamp'. –