欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。
引言
为什么数据库服务器的时间是 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