fzy-blog

Springboot2 jackson2 LocalDateTime LocalDate DateTime 日期格式化处理

2019-05-24

Springboot2 jackson2 LocalDateTime LocalDate DateTime 日期格式化处理

  1. Java 8 LocalDateTime LocalDate DateTime 日期 全局统一处理
  2. 同时支持 SpringCloud Feign 入参对象 日期序列化 出参对象 日期反序列化
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179

import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.*;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.apache.commons.lang3.StringUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.convert.converter.Converter;
import org.springframework.lang.NonNull;

import java.io.IOException;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.TimeZone;

/**
* jackson2 日期序列化和反序列化处理
*
* @author zhaoyang10
* @create 2018/11/27
*/
@Configuration
public class DateConverterConfig {

private static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd");
private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("HH:mm:ss");

/**
* jackson2 json序列化 null字段输出为空串
*
* @return
* @author zhaoyang10
*/
@Bean
@Primary
//@ConditionalOnMissingBean(ObjectMapper.class)
public ObjectMapper serializingObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();

JavaTimeModule javaTimeModule = new JavaTimeModule();
//序列化日期格式
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
javaTimeModule.addSerializer(LocalDate.class, new LocalDateSerializer());
javaTimeModule.addSerializer(LocalTime.class, new LocalTimeSerializer());

//反序列化日期格式
javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer());
javaTimeModule.addDeserializer(LocalDate.class, new LocalDateDeserializer());
javaTimeModule.addDeserializer(LocalTime.class, new LocalTimeDeserializer());

objectMapper.registerModule(javaTimeModule);

objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
objectMapper.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));

return objectMapper;
}


/**
* 日期序列化
*/
public class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {

@Override
public void serialize(LocalDateTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(value.format(DATETIME_FORMATTER));
}
}

/**
* 日期反序列化
*/
public class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {

@Override
public LocalDateTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return LocalDateTime.parse(p.getValueAsString(), DATETIME_FORMATTER);
}
}

/**
* 日期序列化
*/
public class LocalDateSerializer extends JsonSerializer<LocalDate> {

@Override
public void serialize(LocalDate value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(value.format(DATE_FORMATTER));
}
}

/**
* 日期反序列化
*/
public class LocalDateDeserializer extends JsonDeserializer<LocalDate> {

@Override
public LocalDate deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return LocalDate.parse(p.getValueAsString(), DATE_FORMATTER);
}
}

/**
* 日期序列化
*/
public class LocalTimeSerializer extends JsonSerializer<LocalTime> {

@Override
public void serialize(LocalTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
gen.writeString(value.format(TIME_FORMATTER));
}
}

/**
* 日期反序列化
*/
public class LocalTimeDeserializer extends JsonDeserializer<LocalTime> {

@Override
public LocalTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
return LocalTime.parse(p.getValueAsString(), TIME_FORMATTER);
}
}

/**
* 接收前端入参日期的转换处理
*
* @return
*/
@Bean
public Converter<String, LocalDateTime> LocalDateTimeConvert() {
return new Converter<String, LocalDateTime>() {
@Override
public LocalDateTime convert(@NonNull String source) {
LocalDateTime date = null;
if (StringUtils.isNotBlank(source)) {
date = LocalDateTime.parse(source, DATETIME_FORMATTER);
}
return date;
}
};
}

@Bean
public Converter<String, LocalDate> LocalDateConvert() {
return new Converter<String, LocalDate>() {
@Override
public LocalDate convert(@NonNull String source) {
LocalDate date = null;
if (StringUtils.isNotBlank(source)) {
date = LocalDate.parse(source, DATE_FORMATTER);
}
return date;
}
};
}

@Bean
public Converter<String, LocalTime> LocalTimeConvert() {
return new Converter<String, LocalTime>() {
@Override
public LocalTime convert(@NonNull String source) {
LocalTime time = null;
if (StringUtils.isNotBlank(source)) {
time = LocalTime.parse(source, TIME_FORMATTER);
}
return time;
}
};
}

}

有时候,我们对日期格式要做特殊的处理,全局的格式化方式无法满足我们需求时,通过 @JsonFormat 注解我们可以更为精准的为日期字段格式化,它也是优先级最高的 年月日时分秒 转 年月日

1
2
3
4
5
6
public class Order {

@JsonFormat(pattern = "yyyy-MM-dd")
private LocalDateTime payTime;
// 省略 GET SET ...
}
使用支付宝打赏
使用微信打赏

若你觉得我的文章对你有帮助,欢迎点击上方按钮对我打赏

扫描二维码,分享此文章