JavaWeb - 日期时间数据格式化

Parker

问题描述

在JavaWeb开发中,日期时间数据在后端往往以对象属性的形式存储。但当日期时间数据以json格式传到前端时,会丢失其格式而变成普通数组,无法正确显示为日期时间格式。

解决方式

方式一

在日期时间属性上加@JsonFormat注解,对日期进行格式化:

但这种方式,需要在每个时间属性上都要加上该注解,使用较麻烦,不能全局处理。

方式二(推荐 )

WebMvcConfiguration中扩展SpringMVC的消息转换器,统一对日期类型进行格式处理

代码

sky-server模块,WebMvcConfiguration.java中:

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 扩展Spring MVC框架的消息转化器
* @param converters
*/
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
// 创建消息转换器对象
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
// 为消息转换器设置一个对象转换器,对象转换器可以将Java对象序列化为json数据
converter.setObjectMapper(new JacksonObjectMapper());
// 将自己的消息转化器加入容器中(index:0 指定将自己的消息转化器放在首位,优先使用)
converters.add(0,converter);
}

sky-common模块,JacksonObjectMapper.java中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/**
* 对象映射器:基于jackson将Java对象转为json,或者将json转为Java对象
* 从Java对象生成JSON的过程称为 [序列化Java对象到JSON]
* 将JSON解析为Java对象的过程称为 [从JSON反序列化Java对象]
*/
public class JacksonObjectMapper extends ObjectMapper {

public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
// 可指定为其他类型的日期时间格式
// public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";

public JacksonObjectMapper() {
super();
//收到未知属性时不报异常
this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);

//反序列化时,属性不存在的兼容处理
this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

SimpleModule simpleModule = new SimpleModule()
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));

//注册功能模块 例如,可以添加自定义序列化器和反序列化器
this.registerModule(simpleModule);
}
}

效果

评论
此页目录
JavaWeb - 日期时间数据格式化