由于时区协商不一致导致的日期查询出错
问题描述
数据库中数据
数据库数据类型
查询测试代码
@Test
public void testDatePrint() {
PackageEntity entity = starPackageDao.queryPackageById(25);
System.out.println(entity.getAddTime());
}
直接输出查到的addTime
查询结果
可以看出查询结果比实际多出了27 - 14 = 13
13个小时,其他查询结果也是一样无一例外都是多出了13个小时。
bug原因
Mysql中的时区
- system_time_zone:系统时区
- time_zone:会话时区,默认为系统时区
Java中的时区
java的calendar保存的cst对应的不是中国时区,而是美国时区。
tips:
- 美国中部时间 Central Standard Time (USA) UTC-06:00
- 澳大利亚中部时间 Central Standard Time (Australia) UTC+09:30
- 中国标准时 China Standard Time UTC+08:00
- 古巴标准时 Cuba Standard Time UTC-04:00
其中美国中部时间还分冬令时和夏令时,夏令时为UTC-05:00
Java误认为mysql中的CST是美国中部时间,所以在查询后将其转为了本机默认时区 Asia/Shanghai +0800,即+13/+14
解决方案
1.对症下药
-
修改mysql数据库的时区
set global time_zone = '+08:00';
set time_zone = '+08:00'; -
连接数据库时约定会话时区
serverTimezone=Asia/Shanghai
但是公司的开发环境不允许这种采用上述两种方法🤢
2.无奈之举
不采用日期格式才存储当前时间,可以用:
- 毫秒数System.currentTimeMillis()
- 字符串SimpleDateFormat
来代替。这样需要在插入和读取数据时添加额外的转换。