在将 Java 日期写入 SQL TIMESTAMP 列之前,JDBC 是否将日期从 JVM 时区转换为数据库会话时区?

2022-09-01 16:08:12

在将 Java 日期写入 SQL 时间戳列之前,JDBC 是否将日期从 Java 虚拟机时区转换为数据库会话的日期?

例如,假设 Java 虚拟机时区为 UTC,数据库会话时区为 UTC-5。如果 Java 程序尝试通过将其传递给 PreparedStatement#setTimestamp(int, Timestamp) 来存储,根据 JDBC 标准,数据库将存储还是 ?2000-01-01 00:00:00TIMESTAMP '2000-01-01 00:00:00'TIMESTAMP '1999-12-31 19:00:00'


答案 1

不,JDBC 只是一个关于客户端如何访问数据库的 API。对于时间戳存储,这必须取决于编写符合 JDBC API 标准的数据库驱动程序的组织。

下面是 MySQL 的实现。他们似乎将Java的JVM时区带到MySQL时区(检查方法)。PreparedStatementsetTimestampInternal()


答案 2

现在我的要求是,它应该以GMT / UTC存储值,而不管JVM的时区如何。有没有办法动态设置时区,然后在我完成JDBC后取消设置它?

编辑:好的,我找到了解决这个问题的方法。执行了以下操作

TimeZone default = TimeZone.getDefault();
try
{
  TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

  //Do stuff with JDBC
}
finally
{
  TimeZone.setDefault(default);
}