对于Spring项目,mysql-connector-java
已从6.0.6
迁移到8.0.11
。
因此8.0.11
问题如下:
Caused by: com.mysql.cj.exceptions.InvalidConnectionAttributeException:
The server time zone value 'PET' is unrecognized or represents more than one time zone.
You must configure either the server or JDBC driver (via the serverTimezone configuration property)
to use a more specifc time zone value if you want to utilize time zone support.
之后做研究
解决方案是更改URL
(我不想返回先前版本)
mysql.jdbcUrl = jdbc:mysql://localhost:3306/web_v01?useSSL=false
mysql.jdbcUrl = jdbc:mysql://localhost:3306/web_v01?useSSL=false&serverTimezone=UTC
注意添加&serverTimezone=UTC
在我的数据库中,我有以下内容:
mysql> select * from persona;
+-----+--------------+-------------+------------+
| id | nombre | apellido | fecha |
+-----+--------------+-------------+------------+
...
| 088 | Something | Something | 1981-07-06 |
...
+-----+--------------+-------------+------------+
当Spring
应用程序通过RowMapper<Persona>
从数据库检索时,我可以确认rs.getDate("fecha")
返回1981-07-05
(观察当天减少了一天,它是不正确)
如果mysql-connector-java
返回6.0.6
,因此mysql.jdbcUrl = jdbc:mysql://localhost:3306/web_v01?useSSL=false
(否 serverTimezone=UTC
)rs.getDate("fecha")
返回1981-07-06
(预期如何)
因此如何解决这个问题与8.0.11
一起使用?
当从一开始就没有声明serverTimezone
时,我想要有相同的行为,当然要避免异常。
因此,如果考虑到serverTimezone
声明的值无关紧要,那么解决方案会更好。
答案 0 :(得分:1)
尝试使用
jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=CST
答案 1 :(得分:0)
就我而言,最不可能的嫌疑人是jackson。
如果您使用 Spring Boot,请将以下属性添加到 application.properties
spring.jackson.time-zone=Asia/Colombo
我在这里详细回答了这个问题 -> https://stackoverflow.com/a/68016006/9183199
答案 2 :(得分:-1)
有几个与时区相关的属性:
useTimezone: 在客户端和服务器时区之间转换时间/日期类型(是/否,默认为“假”)?这是旧版日期时间代码的一部分,因此,仅当“ useLegacyDatetimeCode = true”时,该属性才有效。 默认值:false
useLegacyDatetimeCode: 使用代码在结果集和语句中处理DATE / TIME / DATETIME / TIMESTAMP的代码,这些结果和语句始终处理从客户端到服务器的时区转换,然后再返回,或者将旧代码用于驱动程序中的这些数据类型以实现向后兼容?将此属性设置为“ false”将使“ useTimezone”,“ useJDBCCompliantTimezoneShift”,“ useGmtMillisForDatetimes”和“ useFastDateParsing”的效果无效。 默认值:true
serverTimezone: 覆盖检测/时区映射。在服务器的时区未映射到Java时区时使用
如果mysql-connector-java为5.1,则应指定三个属性,如下所示: jdbc:mysql:// host:port / dbname?useTimezone = true&useLegacyDatetimeCode = true&serverTimezone = GMT%2B08:00
如果mysql-connector-java为8.0,则应指定一个属性,如下所示: jdbc:mysql:// host:port / dbname?serverTimezone = GMT%2B08:00