Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment changer le fuseau horaire MySQL dans une connexion à une base de données à l'aide de Java ?

useTimezone est une solution de contournement plus ancienne. L'équipe MySQL a réécrit le code setTimestamp/getTimestamp assez récemment, mais il ne sera activé que si vous définissez le paramètre de connexion useLegacyDatetimeCode=false et que vous utilisez la dernière version du connecteur mysql JDBC. Ainsi, par exemple :

String url =
 "jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false

Si vous téléchargez le code source de mysql-connector et regardez setTimestamp, il est très facile de voir ce qui se passe :

Si use legacy date time code =false, newSetTimestampInternal(...) est appelé. Ensuite, si le Calendar passé à newSetTimestampInternal est NULL, votre objet date est formaté dans le fuseau horaire de la base :

this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);

Il est très important que Calendar soit nul - alors assurez-vous d'utiliser :

setTimestamp(int,Timestamp).

... PAS setTimestamp(int,Timestamp,Calendar).

Il devrait être évident maintenant comment cela fonctionne. Si vous construisez une date :5 janvier 2011 3h00 en Amérique/Los_Angeles (ou le fuseau horaire de votre choix) en utilisant java.util.Calendar et appelez setTimestamp(1, myDate), alors il prendra votre date, utilisez SimpleDateFormat pour le formater dans le fuseau horaire de la base de données . Ainsi, si votre base de données est en Amérique/New_York, elle construira la chaîne '2011-01-05 6:00:00' à insérer (puisque NY est en avance sur LA de 3 heures).

Pour récupérer la date, utilisez getTimestamp(int) (sans le calendrier). Une fois de plus, il utilisera le fuseau horaire de la base de données pour créer une date.

Remarque :Le fuseau horaire du serveur Web n'a plus aucune importance ! Si vous ne définissez pas useLegacyDatetimecode sur false, le fuseau horaire du serveur Web est utilisé pour le formatage - ajoutant beaucoup de confusion.

Remarque :

Il est possible que MySQL se plaigne que le fuseau horaire du serveur est ambigu. Par exemple, si votre base de données est configurée pour utiliser EST, il peut y avoir plusieurs fuseaux horaires EST possibles en Java, vous pouvez donc clarifier cela pour mysql-connector en lui indiquant exactement quel est le fuseau horaire de la base de données :

String url =
 "jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";

Vous ne devez le faire que s'il se plaint.