java时区相关问题(被恶心到了)

在项目开发中,遇到了mysql5.7数据库相关的时区问题。整理如下:

问题一:在使用swagger测试接口时,数据库记录的时间和输入的不一致。如下图:

image
swagger中输入的是:"receiveStopTime": "2022-06-09 14:00:00"
数据库中记录的是:"receiveStopTime": "2022-06-09 06:00:00"(少了8小时)

解决方法一:

windows系统:设置mysql5.7服务的时区方法

1.在安装mysql的目录中找到my.ini文件,在文件中添加时区参数(东八区):

点击查看代码
[mysql]
 
# 设置mysql客户端默认字符集
default-character-set=utf8 
[mysqld]
#设置3306端口
port=3306 
# 设置mysql的安装目录
basedir=E:\environment\mysql-5.7.19-winx64\mysql-5.7.19-winx64
# 允许最大连接数
max_connections=1000
# 服务端使用的字符集默认为8比特编码的latin1字符集
character-set-server=utf8
#设置默认时区
default-time-zone=+8:00
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB


# 设置mysql数据库的数据的存放目录
datadir=E:\environment\mysql-5.7.19-winx64\mysql-5.7.19-winx64\data

2.在springboot项目中,controoler接口的参数使用@RequestBody注解,并且在dto上把和时间有关的字段加上 @JsonFormat注解:

点击查看代码-controoler接口
 @PostMapping("/add")
    @ApiOperation("新增接单时间")
    public Result add(@RequestBody MasterReceiveOrderTimeDTO dto ) {
        masterReceiveOrderTimeService.add(dto);
        return new Result().ok("新增接单时间-成功!");
    }
点击查看代码-dto
package cn.itcast.master.modules.masterReceiveOrderTime.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;
import java.util.Date;

/**
 * @Classname MasterReceiveOrderTimeDTO
 * @Description 师傅接单时间管理-前端需要传的参数
 * @Date 2022/2/21 11:35
 * @Created by 小郭
 */
@Data
public class MasterReceiveOrderTimeDTO implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "师傅入驻表id")
    private String masterWorkerId;

    @ApiModelProperty(value = "接单开始时间")
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    private Date receiveStartTime;

    @ApiModelProperty(value = "接单结束时间")
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    private Date receiveStopTime;

}

3.在springboot项目中,给前端用户返回的时间字段上添加@JsonFormat注解:

点击查看代码-vo
@Data
public class MasterReceiveOrderTimeVO implements Serializable {
    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "主键id")
    private String id;

    @ApiModelProperty(value = "接单状态:0-不接单,1-接单(默认为1-接单)")
    private Integer receiveStatus;

    @ApiModelProperty(value = "接单开始时间")
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    private Date receiveStartTime;

    @ApiModelProperty(value = "接单结束时间")
    @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
    private Date receiveStopTime;

}

linux系统:使用docker安装的mysql5.7,设置mysql5.7服务的时区方法

1.进入Docker里面的mysql容器里面:
docker exec -it mysql /bin/bash
2.密码登录:
mysql -u root -p root
3.安装vim(这里的安装,是指在容器中安装,如果没有安装的话,就先安装,安装了的跳过这一步)
apt-get update
apt-get install vim
4.编辑配置文件
vim /etc/mysql/mysql.conf.d/mysqld.cnf
在文件中加入
default-time-zone=+8:00
保存退出
5.重启镜像
docker restart mysql

解决方法 二(推荐):

该方法就和设置mysql数据库的时区没什么关系了,直接在项目的配置文件中设置连接数据库的参数,直接跳过数据库本身的时区,(这个方法比较好用,不用关心数据库的时区问题)

1.在项目的application.yml配置文件中设置数据库连接参数
jdbc:mysql://服务器ip:3306/jjb?useUnicode=true&characterEncoding=utf-8&useTimezone=true&serverTimezone=GMT%2B8&useSSL=false
注意useTimezone=true这个参数,为true,才会跳过数据库的时区
OK,直接解决问题

posted @ 2022-06-09 13:07  青喺半掩眉砂  阅读(226)  评论(0编辑  收藏  举报