在我们使用JDK1.8新增的时间类LocalDateTime时,可能会遇到这样的问题:

我们明明在application.properties配置文件中规定了时间的返回格式

1
2
spring.mvc.format.date=yyyy-MM-dd HH:mm:SS
spring.jackson.date-format=yyyy-MM-dd HH:mm:SS

但是,返回给前端显示的却是形如2020-11-08T13:52:03这样的格式,中间莫名其妙增加了一个T。

这是因为LocalDateTime的ToString()方法是这样实现的

1
2
3
4
@Override
public String toString() {
return date.toString() + 'T' + time.toString();
}

可以看到,该方法在日期和时间之间拼接了一个T字符,这就是之前多出一个T字符的原因。

好了,知道了原因,那么如何更改让他去掉这个T字符呢? 使用如下的模板代码即可。

插个眼,以后项目肯定用得着。

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.convert.converter.Converter;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

/**
* @author : JRabbit
* @date : 2020-11-08 01:17
* TODO : localdatetime时间转换器 去掉2020-09-29T12:53:19中间的T
*
*/
@Configuration
public class LocalDateTimeConverter implements Converter<String, LocalDateTime> {

/**
* 获取配置文件中时间格式
*/
@Value("${spring.mvc.format.date}")
private String format;

/**
* 将URL中携带的的时间参数转化为LocalDateTime对象
* @param s 时间字符串
* @return LocalDateTime对象
*/
@Override
public LocalDateTime convert(String s) {
DateTimeFormatter df = DateTimeFormatter.ofPattern(format);
LocalDateTime date = null;
try {
date = LocalDateTime.parse(s, df);
} catch (Exception e) {
e.printStackTrace();
}
return date;
}

/**
*
* @return LocalDateTimeSerializer 序列化器对象
*/
@Bean
public LocalDateTimeSerializer localDateTimeSerializer() {
return new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(format));
}

/**
*
* @return LocalDateTimeDeserializer 反序列化器对象
*/
@Bean
public LocalDateTimeDeserializer localDateTimeDeserializer() {
return new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(format));
}

/**
* 负责将LocalDateTime对象转化为Json对象时按规定的格式进行序列化
* 将LocalDateTime对象转化为json格式的字符串时间
* 例如: 将LocalDateTime的实例转为{"creatTime":"2020-11-08 23:05:28"}
* @return Jackson2ObjectMapperBuilderCustomizer
*/
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() {
// 调用按类型序列化方法serializerByType()
return builder -> builder.serializerByType(LocalDateTime.class, localDateTimeSerializer());
}

/**
* 负责将Json对象转化为LocalDateTime对象时按规定的格式进行反序列化
* 将json格式的字符串时间转化为LocalDateTime对象
* 例如: 将 {"creatTime":"2020-11-08 23:05:28"}转为LocalDateTime的实例
* @return Jackson2ObjectMapperBuilderCustomizer
*/
@Bean
public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer2() {
// 调用按类型反序列化方法deserializerByType()
return builder -> builder.deserializerByType(LocalDateTime.class,localDateTimeDeserializer());
}
}