2011-04-11 4 views
0

J'ai écrit une webapp en utilisant spring + hibernate. J'ai développé tout sur Windows et ensuite je l'ai déplacé vers un serveur virtuel Linux (Aruba, un fournisseur italien). J'ai remarqué une chose agaçante: quand les dates ont été sauvegardées sur les fenêtres, le temps serait le même que celui de mon "horloge murale", donc si je lis 13h45, j'aurai la même heure dans la ligne mysql. Cela ne se produit pas sous Linux de toute façon. En fait la machine linux est aussi sur CEST (mon fuseau horaire), je l'ai tapé "date" dans le shell. Mais je reçois les dates enregistrées dans la base de données avec un décalage par rapport à GMT. Encore une fois, mon application affiche toujours tout en GMT (y compris GMT comme fuseau horaire si je choisis de formater les dates pour afficher le fuseau horaire) et mysql enregistre tout dans ce format. Comment puis-je contrôler tout cela?Beahviours mysql étranges avec des fuseaux horaires? Comment les contrôler?

Répondre

0

Je poste la solution moi-même, parce que je pense que ça vaut la peine de l'avoir dans ce site.

Tout d'abord: mySql ne stocke aucune information de fuseau horaire. Donc, dites que vous utilisez GMT + 4 et que vous écrivez quelques enregistrements contenant des champs de date. Ensuite, vous déplacez votre système dans GMT-2 vous lisez ces enregistrements (peut-être en important les données de mysqldump). Si votre système et votre machine virtuelle ont le fuseau horaire GMT-2, les dates que vous lisez seront prises comme si elles avaient été écrites en GMT-2 et NON AJUSTÉES.

Solution: Prenez le contrôle de votre fuseau horaire VM en utilisant l'option de ligne de commande -Duser.timezone="GMT" (vous pouvez même mettre dans votre script de démarrage Tomcat) ou votre fuseau horaire préféré (mais GMT est mieux, laissez-moi vous expliquer pourquoi). De cette façon, vous saurez pour le avec quel fuseau horaire votre machine virtuelle fonctionne. Ce ne signifie pas que Java VM supposera que votre temps système est celui que vous avez spécifié dans votre user.timezone, il connaîtra le fuseau horaire du système et ajustera les dates en conséquence. En fait, si vous n'êtes pas en GMT, vous verrez les dates ajustées à GMT et enregistrées dans la base de données en conséquence. De cette façon, vous serez sûr que vous l'utilisez comme référence.

Le problème est que si vous prenez un objet date et que vous faites myDateObject.toString(), vous obtiendrez la date ajustée à GMT, avec le décalage horaire. Ce n'est pas ce que vous voudrez probablement.

La solution est d'utiliser SimpleDateFormat et faire somthing comme ça quand vous avez à la sortie une date:

SimpleDateFormat dateFormat = new SimpleDateFormat(
      "HH:mm dd/MM/yyyy z", Locale.ITALY); 

     dateFormat.setTimeZone(TimeZone.getTimeZone("Europe/Rome")); 

Tout va se convertir dans le bon sens. Vous pouvez même aller plus loin si vous développez une application Web. Vous pouvez extraire le fuseau horaire de HttpRequest et ajuster la sortie de la date en conséquence, mais je ne suis pas allé jusqu'à écrire une application destinée uniquement aux utilisateurs italiens: D (yay).

Espérons que cela aidera.

Questions connexes