useTimezone is een oudere oplossing. Het MySQL-team heeft de code setTimestamp/getTimestamp vrij recent herschreven, maar deze wordt alleen ingeschakeld als u de verbindingsparameter useLegacyDatetimeCode=false instelt en u de nieuwste versie van de mysql JDBC-connector gebruikt. Dus bijvoorbeeld:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false
Als je de broncode van de mysql-connector downloadt en naar setTimestamp kijkt, is het heel gemakkelijk om te zien wat er gebeurt:
Als gebruik legacy date time code =false, wordt newSetTimestampInternal(...) aangeroepen. Als de kalender die is doorgegeven aan newSetTimestampInternal NULL is, wordt uw datumobject opgemaakt in de tijdzone van de database:
this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);
Het is erg belangrijk dat Agenda null is - dus zorg ervoor dat u het volgende gebruikt:
setTimestamp(int,Timestamp).
... NIET setTimestamp(int,Timestamp,Calendar).
Het moet nu duidelijk zijn hoe dit werkt. Als u een datum maakt:5 januari 2011 03:00 uur in Amerika/Los_Angeles (of welke tijdzone u ook wilt) met java.util.Calendar en setTimestamp (1, myDate) aanroept, dan zal uw datum worden gebruikt, gebruik SimpleDateFormat om het op te maken in de database-tijdzone . Dus als je database zich in Amerika/New_York bevindt, zal het de string '2011-01-05 6:00:00' construeren die moet worden ingevoegd (aangezien NY 3 uur voor ligt op LA).
Gebruik getTimestamp(int) (zonder de kalender) om de datum op te halen. Het zal opnieuw de tijdzone van de database gebruiken om een datum op te bouwen.
Opmerking:De tijdzone van de webserver is nu volledig irrelevant! Als u useLegacyDatetimecode niet instelt op false, wordt de tijdzone van de webserver gebruikt voor de opmaak, wat voor veel verwarring zorgt.
Opmerking:
Het is mogelijk dat MySQL mijn klacht klaagt dat de tijdzone van de server dubbelzinnig is. Als uw database bijvoorbeeld is ingesteld om EST te gebruiken, kunnen er verschillende mogelijke EST-tijdzones in Java zijn, dus u kunt dit voor mysql-connector verduidelijken door precies te vertellen wat de databasetijdzone is:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";
Je hoeft dit alleen te doen als het klaagt.