程序时间与数据库时间相差13小时或14小时,甚至相差20几个小时
在进行数据库开发的时候,和时间打交道就会涉及到时区,一个日期时间字段从
应用层
→ 数据库客户端
→ 数据库服务端
传递过程中会跟以下几个时区打交道:
- JVM 时区(默认取操作系统时区,见后文)
- 数据库客户端设置的时区参数(
serverTimezone
),数据库会话的时区 - 数据库服务端的时区(默认取操作系统时区,见后文)
- 操作系统时区
要想在时区问题少踩坑(比如存在库里面的时间多了几个小时)可以这样做:
- 数据库服务端的时区参数
time_zone
设置一个明确的值,比如+8:00
。这个不是必须的,但是建议设置。
数据库客户端通过serverTimezone
参数设置自己的时区,这一步至关重要,它应该程序打印出的时区,mysql的时区保持一致
System.out.println("==================="+TimeZone.getDefault());
我遇到的这个问题场景如下:serverTimezone 写成了大写 serverTimeZone
jdbc:mysql://192.168.32.132:33080/demo_2021?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true
mysql时区显示如下:
show variables like ‘%time_zone%’; | |
system_time_zone | CST |
time_zone | SYSTEM |
这时显示的时间:别怀疑,这特喵的还是没发生的时间,serverTimezone就这个参数写错
操作系统 | mysql |
[root@d-sn-003 ~]# date 2021年 03月 19日 星期五 13:58:33 CST |
select now(); 2021-03-20 02:59:38 |
记录下,容器MySQL挂载时区相关,两者都是修改时区相关,一个是和操作系统保存同步,一个是直接指定
environment: MYSQL_ROOT_PASSWORD: 12345678 TZ: Asia/Shanghai volumes: - /etc/localtime:/etc/localtime