Java数据库时间返回前端错误(差八个小时)
·
先赞后看,养成习惯!!! ^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我坚持下去的动力,点赞后不要忘记关注我哦
如有错误,请您指正批评 ^ _ ^
项目场景:
一般这个问题在获取本地时间遇到用new Date()方法时。
问题描述:
在做java项目时,需要获取本地时间并写入数据库,发现比正常时间少8个小时。
原因:
- Java应用时区设置错误:
Java 应用默认使用的是 JVM 的默认时区,如果 JVM 时区设置为 UTC(或不是 Asia/Shanghai),那么 new Date() 或 LocalDateTime.now() 获取的时间就是 UTC 时间,比中国时间(CST,UTC+8)少 8 小时。 - 数据库时区设置错误:
数据库(如 MySQL)也有自己的时区设置。如果数据库时区是 UTC,而 Java 传入的是 UTC 时间,数据库会按 UTC 存储,查询时如果不转换,看起来就少了 8 小时。 - JDBC 驱动时区转换问题:
某些 JDBC 驱动(如 MySQL 8.x)在传输时间数据时,会根据 连接参数中的时区设置 进行转换。如果 Java 和数据库时区不一致,可能会导致时间偏差。
解决方案:
- 检查并设置 JVM 时区为 Asia/Shanghai
-Duser.timezone=Asia/Shanghai
或者在springboot框架下的yml文件下设置:
spring:
jackson:
time-zone: Asia/Shanghai
- 使用 LocalDateTime.now(ZoneId.of(“Asia/Shanghai”))
```kotlin
LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
- 检查数据库时区设置(以 MySQL 为例)
-- 查看数据库时区
SELECT @@global.time_zone, @@session.time_zone;
-- 设置为东八区
SET GLOBAL time_zone = '+08:00';
SET SESSION time_zone = '+08:00';
- JDBC 连接字符串指定时区(MySQL 8+)
spring.datasource.url=jdbc:mysql://localhost:3306/yourdb?serverTimezone=Asia/Shanghai&useSSL=false
总结
确保 Java 应用、JVM、数据库、JDBC 连接都使用统一的时区:Asia/Shanghai(UTC+8)。
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)