useTimezone é uma solução mais antiga. A equipe do MySQL reescreveu o código setTimestamp/getTimestamp recentemente, mas ele só será habilitado se você definir o parâmetro de conexão useLegacyDatetimeCode=false e estiver usando a versão mais recente do conector JDBC do mysql. Assim, por exemplo:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false
Se você baixar o código fonte do conector mysql e olhar setTimestamp, é muito fácil ver o que está acontecendo:
Se usar código de data e hora legado =false, newSetTimestampInternal(...) é chamado. Então, se o calendário passado para newSetTimestampInternal for NULL, seu objeto de data será formatado no fuso horário do banco de dados:
this.tsdf = new SimpleDateFormat("''yyyy-MM-dd HH:mm:ss", Locale.US);
this.tsdf.setTimeZone(this.connection.getServerTimezoneTZ());
timestampString = this.tsdf.format(x);
É muito importante que o Agenda seja nulo - portanto, certifique-se de usar:
setTimestamp(int,Timestamp).
... NÃO setTimestamp(int,Timestamp,Calendar).
Deve ser óbvio agora como isso funciona. Se você construir uma data:5 de janeiro de 2011 3:00 AM na América/Los_Angeles (ou qualquer fuso horário que você quiser) usando java.util.Calendar e chamar setTimestamp(1, myDate), então ele pegará sua data, use SimpleDateFormat para formatá-lo no fuso horário do banco de dados . Portanto, se seu banco de dados estiver em America/New_York, ele construirá a String '2011-01-05 6:00:00' a ser inserida (já que NY está à frente de LA em 3 horas).
Para recuperar a data, use getTimestamp(int) (sem o Calendário). Mais uma vez, ele usará o fuso horário do banco de dados para criar uma data.
Observação:O fuso horário do servidor da Web é completamente irrelevante agora! Se você não definir useLegacyDatetimecode como false, o fuso horário do servidor da Web será usado para formatação - adicionando muita confusão.
Observação:
É possível que o MySQL reclame que o fuso horário do servidor é ambíguo. Por exemplo, se seu banco de dados estiver configurado para usar EST, pode haver vários fusos horários EST possíveis em Java, então você pode esclarecer isso para o conector mysql informando exatamente qual é o fuso horário do banco de dados:
String url =
"jdbc:mysql://localhost/mydb?useLegacyDatetimeCode=false&serverTimezone=America/New_York";
Você só precisa fazer isso se reclamar.