记一次JAVA问题排查:查询出来的LocalDateTime类型时间不受serverTimezone影响

  • Post author:
  • Post category:java

前提

jdbc和mybatis依赖的版本

<dependency>
	<groupId>org.mybatis</groupId>
	<artifactId>mybatis</artifactId>
	<version>3.5.7</version>
</dependency>
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.25</version>
	<scope>runtime</scope>
</dependency>

服务器所在时区UTC+8,
配置文件中设置serverTimezone=UTC

1.字段createtime是LocalDateTime类型

现在服务器时间是**18:00**,
使用**LocalDateTime=18:00**插入到数据库还是**18:00**
查询数据,服务器使用LocalDateTime查出来还是**18:00**

按道理说,服务器时间和数据库时间应该会不同的,因为服务器时区和serverTimezone的时区是不一样的,但是很明显LocalDateTime类型的数据不受serverTimezone影响,后面会有博主根据源码调试的结果也证明确实LocalDateTime类型不受serverTimezone影响

2.字段createtime是Date类型

现在服务器时间是**18:00**,
使用**Date=18:00**插入到数据库还是**10:00**
查询数据,服务器使用Date查出来还是**18:00**

因为服务器时区和serverTimezone的时区是不一样的,Date类型的数据受serverTimezone影响,后面会有博主根据源码调试的结果证明Date类型受serverTimezone影响

结论:

1.LocalDateTime在jdbc中会不经处理直接映射成数据库表中的时间。查询的时候也是会将数据库表中时间直接映射成LocalDateTime。其实就是默认数据库时区和服务器时区是一致的
2.Date类型则会在jdbc中被处理,受serverTimeZone的影响,会先将Date类型的数据转换成serverTimeZone时区的时间存入数据库。查询的时候也会根据serverTimeZone来将数据库中的时间转换成服务器时间再映射成Date类型数据。

如果感兴趣可以看看博主的另一篇文章,其中包含jdbc在插入和查询Date和LocalDateTime类型数据时的处理逻辑
jdbc源码调试之查看jdbc对LocalDateTime和Date类型的处理


版权声明:本文为liushuyul原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。