spring boot 配置时区差别

前提

数据库时区:GMT+8

show variables like '%time_zone%';

本机电脑时区:

情景一、不指定时区

传递的参数映射到Data不指定时区,连接数据库不指定时区,保存时间以及获取时间如下:

  • 保存时间

传递的参数:

{
    "date":"2019-11-23T18:30:00"
}

 注备:GMT 格林威治时间 ,UTC 标准时间,ISO 标准时间,CST 北京时间 ,GMT = UTC ,例如 GMT+8 = UTC+8

时间相差了 8消失,想要保存的是23日6点半,实际保存的是24日2点半。系统日志打印的也是相差了8小时。

测试01:修改计算机时区

 再次测试保存时间

 

 系统与数据库并不受影响,所以系统时间不会影响。如果不指定时区,程序默认使用 CST 中国时区显示在控制台。而接收的时间默认是 GMT+0 

由于认为输入的时区是0 区,而保存的是+8 区,所以快了8小时

获取时间:

    {
        "id": 29,
        "date": "2019-11-23T18:30:00.000+0000"
    }

获取时间是正确的,没有指定时区,获取的时区是数据库GMT8 区是时间,转换为对象会没有指定时区是GMT 0区,减去8小时显示

情景二、指定数据库连接时区

url: jdbc:mysql://localhost:3306/test?serverTimeZone=GMT+10

测试证明,连接时区对存储日期不受影响

获取时间:

测试证明,连接时区对获取时间没有影响

此处留作疑问

情景三、指定json 映射时区

spring:
    jackson:
        time-zone=GMT+5

存储测试:

{
    "date":"2019-11-23T18:30:00"
}

系统显示:

 

 系统日志显示北京时间23日9点半,比存入时间快了3小时。数据库也是快了3小时。那么当指定时区时,系统不再使用 0 区,而是将输入的时间表有时区。

获取测试:

结果

[
    {
        "id": 34,
        "date": "2019-11-23T23:30:00.000+0500"
    },
    {
        "id": 35,
        "date": "2019-11-23T23:30:00.000+0500"
    },
    {
        "id": 36,
        "date": "2019-11-23T18:30:00.000+0500"
    }
]

只有最后一个时间是正确的,之前的时间都是错误的。

错误分析:从数据库获取的时间是+8 区是时间,现在指定了json 时区,前2者是按0区存储的,现在显示的转换为+5区,导致错误偏移了5小时。

情景四、设置全局时区,且设置了json 时区

TimeZone.setDefault(TimeZone.getTimeZone("GMT+5"));

在启动类上加入时区代码,保存测试

{
    "date":"2019-11-23T18:30:00"
}

 

 获取测试:

[
    {
        "id": 34,
        "date": "2019-11-23T23:30:00.000+0500"
    },
    {
        "id": 35,
        "date": "2019-11-23T23:30:00.000+0500"
    },
    {
        "id": 36,
        "date": "2019-11-23T18:30:00.000+0500"
    },
    {
        "id": 37,
        "date": "2019-11-23T18:30:00.000+0500"
    }
]

测试证明,全局时区只是显示的控制控制台打印的时间,不会影响其他

原文地址:https://www.cnblogs.com/bytecodebuffer/p/11918953.html