在将Java Date写入SQL TIMESTAMP列之前,JDBC是否将日期从Java虚拟机时区转换为数据库会话的日期?
例如,假设Java虚拟机时区为UTC,数据库会话时区为UTC-5。如果Java程序根据JDBC标准尝试2000-01-01 00:00:00通过将其传递给来进行存储PreparedStatement#setTimestamp(int, Timestamp),则数据库将存储TIMESTAMP '2000-01-01 00:00:00'还是TIMESTAMP '1999-12-31 19:00:00'?
2000-01-01 00:00:00
PreparedStatement#setTimestamp(int, Timestamp)
TIMESTAMP '2000-01-01 00:00:00'
TIMESTAMP '1999-12-31 19:00:00'
不,JDBC只是有关客户端如何访问数据库的API。对于时间戳存储,这将必须由编写符合JDBC API标准的数据库驱动程序的组织来决定。
这是MySQL的的实现PreparedStatement。他们似乎将Java的JVM时区带到了MySQL时区(请检查setTimestampInternal()方法)。
PreparedStatement
setTimestampInternal()