SpringBoot项目时区问题

1,987 阅读2分钟

参考资料:

www.jianshu.com/p/085eb3c31…

blog.csdn.net/jianxia801/…

最近,博主在工作中遇到奇怪问题, 前端在某些查询功能时,会将时间条件检验并将北京时间转换成标准时间传入,但是在新增等功能,传入的时间是北京时间,故记录.

1 局部配置

1 入参对象属性使用JsonFormat注解

// 指定为北京时间,将时间加八个小时
@JsonFormat(pattern = "yyyy-MM-dd",timezone="GMT+8")
private Date startTime;

2 全局配置

2 配置一个bean实现整体修改

@Configuration
public class config{
    
@Bean
    public Jackson2ObjectMapperBuilderCustomizer jacksonObjectMapperCustomization() {
        return jacksonObjectMapperBuilder ->
                jacksonObjectMapperBuilder.timeZone(TimeZone.getTimeZone("GMT+8"));
    }

}

3 通过配置文件设置

#spring boot2.0.0 架构问题 时间处理 (映射,时区问题)
  jackson:
  #参数意义:
     #JsonInclude.Include.ALWAYS              默认
     #JsonInclude.Include.NON_DEFAULT     属性为默认值不序列化
     #JsonInclude.Include.NON_EMPTY         属性为 空(””) 或者为 NULL 都不序列化
     #JsonInclude.Include.NON_NULL           属性为NULL   不序列化
    default-property-inclusion: ALWAYS # 默认
    date-format: yyyy-MM-dd HH:mm:ss   # 时间格式
    time-zone: GMT+8				 # 北京时间

4 在Application启动类中添加

@SpringBootApplication
public class Application {
 
    @PostConstruct
    void setDefaultTimezone() {
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
    }
 
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
 
}

5 在Application启动类方法中添加

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        
        TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
       
        SpringApplication.run(Application.class, args);
    }
 
}

总结:

方法说明
方法一: JsonFormat针对每一个入参时间对象属性. 灵活使用,如批量使用,维护较难.
方法二: 添加配置bean通过配置,全局配置,方便维护.但局限性大,要求所有入参都为标准时间.且有变更,需要重启项目.
方法三: 配置文件通过配置,全局配置,方便维护.但局限性大,要求所有入参都为标准时间.
方法四: 启动类添加构造后执行方法通过配置,全局配置,方便维护.但局限性大,要求所有入参都为标准时间.且有变更,需要重启项目.
方法五: 启动类启动方法添加时区设置通过配置,全局配置,方便维护.但局限性大,要求所有入参都为标准时间.且有变更,需要重启项目.

综上, 单个参数需要设置时区,推荐使用方法一,添加注解 ; 多个参数设置时区,推荐方法三,配置文件中添加时区设置.

3 数据库时区问题

Mysql数据库有时区概念,默认系统当前时区.

# 查看Mysql时区
show variables like "%time_zone%";

1 通过命令来设置时区

 set global time_zone = '+8:00'; ##修改mysql全局时区为北京时间,即我们所在的东8> set time_zone = '+8:00'; ##修改当前会话时区
> flush privileges; #立即生效

2 修改配置设置时区

修改MySQL的 my.cnf配置文件,修改时区.

# 打开配置文件
vim /etc/my.cnf

# 在[mysqld]区域中加上
default-time_zone = '+8:00'

# 重启mysql使新时区生效
/etc/init.d/mysqld restart