先赞后看,养成习惯!!! ^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我坚持下去的动力,点赞后不要忘记关注我哦

如有错误,请您指正批评 ^ _ ^

项目场景:

一般这个问题在获取本地时间遇到用new Date()方法时。

问题描述:

在做java项目时,需要获取本地时间并写入数据库,发现比正常时间少8个小时。

原因:

  1. Java应用时区设置错误:
    Java 应用默认使用的是 JVM 的默认时区,如果 JVM 时区设置为 UTC(或不是 Asia/Shanghai),那么 new Date() 或 LocalDateTime.now() 获取的时间就是 UTC 时间,比中国时间(CST,UTC+8)少 8 小时。
  2. 数据库时区设置错误:
    数据库(如 MySQL)也有自己的时区设置。如果数据库时区是 UTC,而 Java 传入的是 UTC 时间,数据库会按 UTC 存储,查询时如果不转换,看起来就少了 8 小时。
  3. JDBC 驱动时区转换问题:
    某些 JDBC 驱动(如 MySQL 8.x)在传输时间数据时,会根据 连接参数中的时区设置 进行转换。如果 Java 和数据库时区不一致,可能会导致时间偏差。

解决方案:

  1. 检查并设置 JVM 时区为 Asia/Shanghai
-Duser.timezone=Asia/Shanghai

或者在springboot框架下的yml文件下设置:

spring:
  jackson:
    time-zone: Asia/Shanghai
  1. 使用 LocalDateTime.now(ZoneId.of(“Asia/Shanghai”))

```kotlin
LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
  1. 检查数据库时区设置(以 MySQL 为例)
-- 查看数据库时区
SELECT @@global.time_zone, @@session.time_zone;

-- 设置为东八区
SET GLOBAL time_zone = '+08:00';
SET SESSION time_zone = '+08:00';
  1. JDBC 连接字符串指定时区(MySQL 8+)
spring.datasource.url=jdbc:mysql://localhost:3306/yourdb?serverTimezone=Asia/Shanghai&useSSL=false

总结

确保 Java 应用、JVM、数据库、JDBC 连接都使用统一的时区:Asia/Shanghai(UTC+8)。



Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐