SpringBoot集成Spring Data JPA保存和返回时间比北京时间早8小时

环境

springboot: 2.1.4.RELEASE
spring-data-jpa: 2.1.6.RELEASE
mysql-connector-java: 8.0.5
mysql数据库: 5.7

mysql数据库配置

可以通过命令show variables like '%time_zone%';查看当前mysql时区配置
可以直接通过命令修改时区,set time_zone='+8:00';,但是下次重启mysql后失效,建议修改mysql配置文件my.ini
[mysqld]配置下面添加配置

[mysqld]
default-time-zone = '+8:00'

配置修改后,重启mysql服务,查看配置是否生效
SpringBoot集成Spring Data JPA保存和返回时间比北京时间早8小时

问题1:保存时间比北京时间早8小时

使用save、saveAndFlush等保存数据是,如果对应的数据库字段是时间类型datetime,会出现保存到库的时间比北京时间早8小时的问题。原因在于数据库连接配置文件
spring.datasource.url=jdbc:mysql://localhost:3306/gseem?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=true

问题1解决

修改时区配置serverTimezone为 Asia/Shanghai 或者 GMT%2b即可
spring.datasource.url=jdbc:mysql://localhost:3306/gseem?serverTimezone=GMT%2b8&useUnicode=true&characterEncoding=utf-8&useSSL=true

问题2:返回到前端的json数据时间字段吧北京时间早8小时

默认情况下,返回的json数据时区是国际标准时区,时间比北京时间早8小时

{
    "code": "1",
    "msg": "success",
    "data": {
        "id": 1,
        "name": "feiyue",
        "password": "123456",
        "age": 20,
        "sex": 2,
        "birthday": "2019-04-27T16:00:00.000+0000",
        "createTime": "2019-04-28T07:06:44.000+0000",
        "updateTime": "2019-04-30T09:15:32.737+0000",
        "status": 1
    }
}

问题2解决

修改application.properties配置文件,添加如下配置

spring.jackson.time-zone=GMT+8

添加后返回结果

{
    "code": "1",
    "msg": "success",
    "data": {
        "id": 1,
        "name": "feiyue",
        "password": "123456",
        "age": 20,
        "sex": 2,
        "birthday": "2019-04-28T00:00:00.000+0800",
        "createTime": "2019-04-28T15:06:44.000+0800",
        "updateTime": "2019-04-30T17:18:51.080+0800",
        "status": 1
    }
}