Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como alterar o fuso horário do MySQL em uma conexão de banco de dados usando Java?


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.