需求:传入的时间String,使用Jackson格式化为LocalDateTime对象。
用例:允许以下情况
2023
2023-12
2023-03-02
2023-03-02 12
2023-03-02 12:13
2023-03-02 12:13:24
期望结果:
2023-01-01T00:00
2023-12-01T00:00
2023-03-02T00:00
2023-03-02T12:00
2023-03-02T12:13
2023-03-02T12:13:24
使用DateTimeFormatter
public class ChineseLocalDateTimeDeserializer extends LocalDateTimeDeserializer {
private static final DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("yyyy[-MM][-dd][ HH[:mm][:ss]]")
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
public ChineseLocalDateTimeDeserializer() {
super(DATE_TIME_FORMATTER);
}
}
示例:
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
/**
* @author CloudStyle
**/
public class Main {
public static void main(String[] args) {
// 创建ObjectMapper对象
ObjectMapper objectMapper = new ObjectMapper();
try {
// 测试不同的时间格式
String jsonString0 = "{\"myTime\":\"2023\"}";
DateObject dateObject0 = objectMapper.readValue(jsonString0, DateObject.class);
System.out.println(dateObject0.getMyTime());
// 测试不同的时间格式
String jsonString00 = "{\"myTime\":\"2023-12\"}";
DateObject dateObject00 = objectMapper.readValue(jsonString00, DateObject.class);
System.out.println(dateObject00.getMyTime());
// 测试不同的时间格式
String jsonString1 = "{\"myTime\":\"2023-03-02\"}";
DateObject dateObject1 = objectMapper.readValue(jsonString1, DateObject.class);
System.out.println(dateObject1.getMyTime());
String jsonString2 = "{\"myTime\":\"2023-03-02 12\"}";
DateObject dateObject2 = objectMapper.readValue(jsonString2, DateObject.class);
System.out.println(dateObject2.getMyTime());
String jsonString3 = "{\"myTime\":\"2023-03-02 12:13\"}";
DateObject dateObject3 = objectMapper.readValue(jsonString3, DateObject.class);
System.out.println(dateObject3.getMyTime());
String jsonString4 = "{\"myTime\":\"2023-03-02 12:13:24\"}";
DateObject dateObject4 = objectMapper.readValue(jsonString4, DateObject.class);
System.out.println(dateObject4.getMyTime());
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
public static class DateObject {
@JsonDeserialize(using = ChineseLocalDateTimeDeserializer.class)
private LocalDateTime myTime;
public LocalDateTime getMyTime() {
return myTime;
}
public void setMyTime(LocalDateTime myTime) {
this.myTime = myTime;
}
}
public static class ChineseLocalDateTimeDeserializer extends LocalDateTimeDeserializer {
private static final DateTimeFormatter DATE_TIME_FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("yyyy[-MM][-dd][ HH[:mm][:ss]]")
.parseDefaulting(ChronoField.MONTH_OF_YEAR, 1)
.parseDefaulting(ChronoField.DAY_OF_MONTH, 1)
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)
.parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
.toFormatter();
public ChineseLocalDateTimeDeserializer() {
super(DATE_TIME_FORMATTER);
}
}
}