【Java实战】系统时间是如何坑人的?

欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。

引言

为什么数据库服务器的时间是 12:00:00,我们的应用程序查询出来的时间却不是呢?

可能是时间不一致,多半是时区偏移的影响。

数据库时区设置time_zone

MySQL常用存储时间数据的类型为DATETIME与TIMESTAMP,其中TIMESTAMP需要使用数据库时区进行解析。

被CST坑惨的TIMESTAMP

在查询MySQL数据时,由于MySQL发送的时间不带时区,Java使用jdbc收到时间后,需要用数据库时区解析为TIMESTAMP。
当Java读取数据库时区(MySQL的系统变量 time_zone)时,得到了CST,但是这个CST有多个含义,可能是北美中部时区,也可以是东八区。
CST 是一个臭名昭著的具有歧义性的时区缩写。它可以代表:

  • China Standard Time (中国标准时间): UTC+8
  • Central Standard Time (北美中部标准时间): UTC-6 (冬季)
  • Cuba Standard Time (古巴标准时间): UTC-5 (冬季)
  • 可能还有其他不那么常见的含义。

time_zone可以设置为SYSTEM(使用操作系统的时区),也可以设置为一个具体的偏移量(如 +08:00),或者一个命名的时区(如Aisa/Shanghai)。这个设置对 TIMESTAMP 类型的存储和检索有直接影响,也会影响一些时间函数的行为。

Java可能认为CST是北美时区,并以此转换TIMESTAMP。
因此,最好手动配置数据库配置:

default-time-zone = +08:00
character-set-server=utf8mb4

或者

default-time-zone = Asia/Shanghai
character-set-server=utf8mb4

或者最常见的,在jdbc连接字符串中指定serverTimezone:

jdbc:mysql://localhost:3306/mydatabase?serverTimezone=Asia/Shanghai
或者
jdbc:mysql://localhost:3306/mydatabase?serverTimezone=UTC

时间类型选择

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值