java - 如何使用 Java 更改数据库连接中的 MySQL 时区?

标签 java mysql jdbc timezone

MySQL 使用时区“GMT+8”运行,但 Tomcat 使用“GMT”运行。当我将日期时间保存到数据库时,一切似乎都正常,但是当我检查数据库中的日期时间值时,我看到了“GMT”值。

此外,当我尝试从数据库中获取值时,该值发生了更改,似乎数据库中的值被视为“GMT+8”,因此Java将值更改为“GMT”。

我已经设置了这样的连接 URL:

useTimezone=true&serverTimezone=GMT

但是它不起作用。

最佳答案

useTimezone 是一个较旧的解决方法。 MySQL 团队最近重写了 setTimestamp/getTimestamp 代码,但只有在设置连接参数 useLegacyDatetimeCode=false 并且使用最新版本的 mysql JDBC 连接器时才会启用它。例如:

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

如果您下载 mysql-connector 源代码并查看 setTimestamp,很容易看出发生了什么:

如果使用旧日期时间代码 = false,则调用 newSetTimestampInternal(...)。然后,如果传递给 newSetTimestampInternal 的 Calendar 为 NULL,则您的日期对象将按照数据库的时区进行格式化:

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

日历为空非常重要 - 因此请确保您使用:

setTimestamp(int,Timestamp).

...不是 setTimestamp(int,Timestamp,Calendar)。

现在应该很明显这是如何工作的了。如果您使用 java.util.Calendar 构造日期:2011 年 1 月 5 日凌晨 3:00 在美国/洛杉矶(或您想要的任何时区)并调用 setTimestamp(1, myDate),那么它将采用您的日期,使用 SimpleDateFormat以数据库时区格式化它。因此,如果您的数据库位于 America/New_York,它将构造要插入的字符串“2011-01-05 6:00:00”(因为纽约比洛杉矶早 3 小时)。

要检索日期,请使用 getTimestamp(int)(不带日历)。它将再次使用数据库时区来构建日期。

注意:网络服务器时区现在完全无关!如果您不将 useLegacyDatetimecode 设置为 false,则网络服务器时区将用于格式化 - 增加很多困惑。

<小时/>

注意:

MySQL 可能提示服务器时区不明确。例如,如果您的数据库设置为使用 EST,则 Java 中可能有多个可能的 EST 时区,因此您可以通过准确地告诉 mysql-connector 数据库时区是什么来澄清这一点:

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

只有在出现问题时您才需要执行此操作。

关于java - 如何使用 Java 更改数据库连接中的 MySQL 时区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49542404/

相关文章:

java - Maven Java 编译器 - 使用错误的合规版本出现编译错误

java - 在 Java 中使用 ArrayList 的二维动态数组

Java - 从字符串中删除\u0000

php - 从mysql的mediumtext字段中提取一部分文本,用php制作turn.js书页

java - 为什么使用 JPA/Eclipselink/Texo 进行批量插入比使用纯 JDBC 插入慢得多(!)?

java - 导出处理到jar文件

mysql - 在 mysql workbench 中自定义网格大小

mysql - 基于月份日期的条件 SUM()

java - 在 JDBC 中,当 autocommit 为 false 且未设置显式保存点时,回滚是好风格还是浪费?

mysql - GlassFish 动态 JDBC 池