sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo cambiar la zona horaria de MySQL en una conexión de base de datos usando Java?

useTimezone es una solución más antigua. El equipo de MySQL reescribió el código setTimestamp/getTimestamp recientemente, pero solo se habilitará si configura el parámetro de conexión useLegacyDatetimeCode=false y está usando la última versión del conector mysql JDBC. Entonces, por ejemplo:

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

Si descarga el código fuente del conector mysql y mira setTimestamp, es muy fácil ver lo que está sucediendo:

Si usa el código de fecha y hora heredado =falso, se llama a newSetTimestampInternal(...). Luego, si el Calendario pasado a newSetTimestampInternal es NULL, su objeto de fecha se formatea en la zona horaria de la base de datos:

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

Es muy importante que Calendar sea nulo, así que asegúrese de estar usando:

setTimestamp(int,Timestamp).

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

Debería ser obvio ahora cómo funciona esto. Si construye una fecha:5 de enero de 2011 a las 3:00 a. m. en Estados Unidos/Los Ángeles (o la zona horaria que desee) usando java.util.Calendar y llame a setTimestamp(1, myDate), entonces tomará su fecha, use SimpleDateFormat para formatearlo en la zona horaria de la base de datos . Entonces, si su base de datos está en América/Nueva_York, construirá la cadena '2011-01-05 6:00:00' que se insertará (ya que NY está por delante de LA por 3 horas).

Para recuperar la fecha, utilice getTimestamp(int) (sin el Calendario). Una vez más, utilizará la zona horaria de la base de datos para crear una fecha.

Nota:¡La zona horaria del servidor web es completamente irrelevante ahora! Si no establece useLegacyDatetimecode en falso, la zona horaria del servidor web se usa para formatear, lo que genera mucha confusión.

Nota:

Es posible que MySQL se queje de que la zona horaria del servidor es ambigua. Por ejemplo, si su base de datos está configurada para usar EST, puede haber varias zonas horarias EST posibles en Java, por lo que puede aclarar esto para mysql-connector diciéndole exactamente cuál es la zona horaria de la base de datos:

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

Solo necesita hacer esto si se queja.