sql >> Base de Datos >  >> RDS >> Oracle

¿Java.sql.Timestamp es específico de la zona horaria?

Aunque no se especifica explícitamente para setTimestamp(int parameterIndex, Timestamp x) los conductores deben seguir las reglas establecidas por setTimestamp(int parameterIndex, Timestamp x, Calendar cal) javadoc:

Establece el parámetro designado en el java.sql.Timestamp dado valor, usando el Calendar dado objeto. El conductor utiliza el Calendar objeto para construir un SQL TIMESTAMP valor, que el controlador luego envía a la base de datos. Con un Calendar objeto, el conductor puede calcular la marca de tiempo teniendo en cuenta una zona horaria personalizada. Si no hay Calendar se especifica el objeto, el controlador utiliza la zona horaria predeterminada, que es la de la máquina virtual que ejecuta la aplicación.

Cuando llama con setTimestamp(int parameterIndex, Timestamp x) el controlador JDBC usa la zona horaria de la máquina virtual para calcular la fecha y la hora de la marca de tiempo en esa zona horaria. Esta fecha y hora es lo que se almacena en la base de datos, y si la columna de la base de datos no almacena información de la zona horaria, entonces se pierde cualquier información sobre la zona (lo que significa que depende de la(s) aplicación(es) que usan la base de datos para usar la misma zona horaria de manera consistente o idear otro esquema para discernir la zona horaria (es decir, almacenar en una columna separada).

Por ejemplo:Su zona horaria local es GMT+2. Usted almacena "2012-12-25 10:00:00 UTC". El valor real almacenado en la base de datos es "2012-12-25 12:00:00". Lo recupera nuevamente:lo recupera nuevamente como "2012-12-25 10:00:00 UTC" (pero solo si lo recupera usando getTimestamp(..) ), pero cuando otra aplicación acceda a la base de datos en la zona horaria GMT+0, recuperará la marca de tiempo como "2012-12-25 12:00:00 UTC".

Si desea almacenarlo en una zona horaria diferente, debe usar setTimestamp(int parameterIndex, Timestamp x, Calendar cal) con una instancia de Calendario en la zona horaria requerida. Solo asegúrese de usar el captador equivalente con la misma zona horaria al recuperar valores (si usa un TIMESTAMP sin información de zona horaria en su base de datos).

Entonces, suponiendo que desea almacenar la zona horaria GMT real, debe usar:

Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
stmt.setTimestamp(11, tsSchedStartTime, cal);

Con JDBC 4.2, un controlador compatible debe ser compatible con java.time.LocalDateTime (y java.time.LocalTime ) para TIMESTAMP (y TIME ) a través de get/set/updateObject . El java.time.Local* las clases no tienen zonas horarias, por lo que no es necesario aplicar ninguna conversión (aunque eso podría abrir un nuevo conjunto de problemas si su código asumiera una zona horaria específica).