SpringBoot项目时区问题
最近,博主在工作中遇到奇怪问题, 前端在某些查询功能时,会将时间条件检验并将北京时间转换成标准时间传入,但是在新增等功能,传入的时间是北京时间,故记录.
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
参考资料: