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.