当前位置: 首页 > 面试题库 >

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

南宫凯康
2023-03-14
问题内容

MySQL的时区为“ GMT + 8”,而Tomcat的时区为“ GMT”。当我将 datetime
保存到数据库中时,一切似乎都正常,但是当我检查数据库中的 datetime 值时,看到了“ 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
AM,并调用setTimestamp(1,myDate),那么它将使用您的日期,请使用SimpleDateFormat在 数据库时区中
对其进行格式化。因此,如果您的数据库位于America / New_York,它将构造要插入的字符串‘2011-01-05
6:00:00’(因为NY比LA提前3小时)。

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

注意: Web服务器时区现在完全不相关! 如果未将useLegacyDatetimecode设置为false,则使用Web服务器时区进行格式设置-
增加很多混乱。

注意:

MySQL可能抱怨服务器时区模棱两可。例如,如果您的数据库设置为使用EST,则Java中可能有几个可能的EST时区,因此您可以通过确切地告诉它mysql-
connector的数据库时区是什么来为mysql-connector澄清这一点:

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

如果抱怨,您只需要这样做。



 类似资料:
  • 问题内容: 如何使用java连接到mysql数据库? 问题答案: 逐步说明如何安装MySQL和JDBC以及如何使用它: 1.下载并安装MySQL服务器。只需按照通常的方式进行即可。每次更改时都请记住端口号。默认情况下3306。 2.下载 JDBC驱动程序并放入classpath,解压缩ZIP文件并将包含的JAR文件放入classpath。特定于供应商的JDBC驱动程序是 JDBC API的具体实现

  • 问题内容: 我正在尝试从我的网站连接数据库,并使用C ++显示一些行。因此,基本上我正在尝试制作一个从站点数据库中的表中进行选择查询的应用程序。现在,这必须可行,因为我已经看到大量的应用程序正在这样做。 我该怎么做呢?有人可以举一个例子,告诉我应该使用哪些库吗? 问题答案: 在这里找到:

  • 请知道,我对数据库很陌生。我能够正确安装mySQL和java连接器驱动程序。但每当我在eclipse中运行程序并尝试从我创建的数据库中检索信息时,我都会收到以下消息:“需要SSL连接,但服务器不支持”。下面是我要使用安全SSL连接运行的代码: `公共静态void main(字符串[]参数){

  • 本文向大家介绍java连接mysql数据库 java连接sql server数据库,包括了java连接mysql数据库 java连接sql server数据库的使用技巧和注意事项,需要的朋友参考一下 在java的应用中,我们经常会对数据库进行必要的操作,下来我们就了解一下如何用java连接mysql数据库 以及java连接sql server数据库 一、mysql 二、sql server 以上就

  • 问题内容: 这个问题已经在这里有了答案 : 将查询错误转换为MySQLi中的异常 (3个答案) 9个月前关闭。 我碰到了这个: PHP错误处理:die()VS trigger_error()VS throw异常 并且理解抛出异常更好 我如何在此代码中替换die并使用throw异常:- 问题答案:

  • 我正在尝试使用SpringBoot连接MySQL数据库,但我遇到以下错误: 应用程序无法以类路径启动:[文件:/C:/Dev/Repositorios/jira quality/target/classes/,文件:/C:/Users/jboscod/.m2/repository/mysql/mysql连接器java/8.0.21/mysql-connector-java-8.0.21.jar,文