一、背景
今天一个同事咨询如何解决后台返回json时,Date类型的格式化如何解决。帮这个兄弟解决完后,觉得虽然很简单,还是写写记录下来,以后别人再问可以直接给连接了。
这位同事使用的是SpringBoot1.0框架。对这个问题1.0 和2.0没有区别。
二、处理单个或某几个Date类型字段的格式转换问题
这种情况下,只需要在字段上加一个@JsonFormat注解即可。如下
public class DateEntity {
private Date dateTime = new Date();
private Date dateTime1 = new Date();
private Date dateTime2 = new Date();
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
public Date getDateTime() {
return dateTime;
}
public void setDateTime(Date dateTime) {
this.dateTime = dateTime;
}
public Date getDateTime1() {
return dateTime1;
}
public void setDateTime1(Date dateTime1) {
this.dateTime1 = dateTime1;
}
public Date getDateTime2() {
return dateTime2;
}
public void setDateTime2(Date dateTime2) {
this.dateTime2 = dateTime2;
}
}
三、配置全局的类型转换(SpringBoot有更好的实现方式,见后记)
如果系统中有很多Date类型字段的格式转换问题的话,一个一个的增加配置,显得太啰嗦了。这时候可以配置MappingJackson2HttpMessageConverter。也很简单,只需要增加一个java 配置类即可。全部代码如下
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
/**
* @author xugj
* 返回Json对象时候,全局Date类型转换配置
* */
@Configuration
public class DateFormateConfig {
private String dateFormate = "yyyy-MM-dd HH:mm:ss";
@Bean
public Jackson2ObjectMapperFactoryBean jackson2ObjectMapperFactoryBean() {
Jackson2ObjectMapperFactoryBean r = new Jackson2ObjectMapperFactoryBean();
r.setDateFormat(new SimpleDateFormat(dateFormate));
return r;
}
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter(Jackson2ObjectMapperFactoryBean objectMapper) {
MappingJackson2HttpMessageConverter r = new MappingJackson2HttpMessageConverter(objectMapper.getObject());
List<MediaType> mediaTypeList=Arrays.asList(MediaType.APPLICATION_JSON_UTF8);
r.setSupportedMediaTypes(mediaTypeList);
return r;
}
}
四、思考:这两种配置的优先级如何?
经测试,字段上的格式设置会覆盖全局的格式设置。
后记:
spring boot 项目在配置文件中设置,可以很简单的实现全局的日期格式转换。
在apllication.properties加入下面配置
#时间戳统一转换
#spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
##这个是时区,一定要加,否则会默认为格林尼治时间,即少8小时
#spring.jackson.time-zone=GMT+8