Mysql
 sql >> Database >  >> RDS >> Mysql

Come modificare il fuso orario di MySQL in una connessione al database utilizzando Java?

useTimezone è una soluzione meno recente. Il team MySQL ha riscritto il codice setTimestamp/getTimestamp abbastanza di recente, ma verrà abilitato solo se imposti il ​​parametro di connessione useLegacyDatetimeCode=false e stai utilizzando l'ultima versione del connettore JDBC mysql. Quindi ad esempio:

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

Se scarichi il codice sorgente del connettore mysql e guardi setTimestamp, è molto facile vedere cosa sta succedendo:

Se use legacy date time code =false, viene chiamato newSetTimestampInternal(...). Quindi, se il calendario passato a newSetTimestampInternal è NULL, l'oggetto data viene formattato nel fuso orario del database:

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

È molto importante che Calendar sia nullo, quindi assicurati di utilizzare:

setTimestamp(int,Timestamp).

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

Dovrebbe essere ovvio ora come funziona. Se costruisci una data:5 gennaio 2011 3:00 AM in America/Los_Angeles (o qualsiasi fuso orario tu voglia) usando java.util.Calendar e chiama setTimestamp(1, myDate), quindi prenderà la tua data, usa SimpleDateFormat per formattarlo nel fuso orario del database . Quindi, se il tuo DB è in America/New_York, costruirà la stringa '2011-01-05 6:00:00' da inserire (poiché NY è avanti di LA di 3 ore).

Per recuperare la data, usa getTimestamp(int) (senza Calendar). Ancora una volta utilizzerà il fuso orario del database per creare una data.

Nota:Il fuso orario del server web è completamente irrilevante ora! Se non imposti useLegacyDatetimecode su false, il fuso orario del server web viene utilizzato per la formattazione, aggiungendo molta confusione.

Nota:

È possibile che MySQL mi lamenti che il fuso orario del server sia ambiguo. Ad esempio, se il tuo database è impostato per utilizzare EST, potrebbero esserci diversi possibili fusi orari EST in Java, quindi puoi chiarirlo per mysql-connector dicendogli esattamente qual è il fuso orario del database:

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

Devi farlo solo se si lamenta.