由于时区协商不一致导致的日期查询出错

问题描述

数据库中数据

image

数据库数据类型

image

查询测试代码

@Test
    public void testDatePrint() {
        PackageEntity entity = starPackageDao.queryPackageById(25);
        System.out.println(entity.getAddTime());
    }

直接输出查到的addTime

查询结果

image

可以看出查询结果比实际多出了27 - 14 = 13 13个小时,其他查询结果也是一样无一例外都是多出了13个小时。

bug原因

Mysql中的时区

image

  • 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
    来代替。这样需要在插入和读取数据时添加额外的转换。
posted @ 2021-06-17 17:24  爱饮凉水  阅读(122)  评论(0编辑  收藏  举报