@Configuration
public class GlobalDateConvertConfig {
/**
* Date轉換器,用於轉換RequestParam和PathVariable參數
*/
@Bean
public Converter<String, Date> dateConverter() {
return new StringToDateConverter();
}
/**
* Json序列化和反序列化轉換器,用於轉換Post請求體中的json以及將我們的對象序列化爲返回響應的json
* 使用@RequestBody註解的對象中的Date類型將從這裏被轉換
*/
@Bean
public ObjectMapper objectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
objectMapper.disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);
JavaTimeModule javaTimeModule = new JavaTimeModule();
//Date序列化和反序列化
javaTimeModule.addSerializer(Date.class, new JsonSerializer<Date>() {
@Override
public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
jsonGenerator.writeString(date == null ? null : String.valueOf(date.getTime()));
}
});
javaTimeModule.addDeserializer(Date.class, new JsonDeserializer<Date>() {
@Override
public Date deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException {
return new StringToDateConverter().convert(jsonParser.getText());
}
});
objectMapper.registerModule(javaTimeModule);
return objectMapper;
}
}
@Slf4j
@Component
public class StringToDateConverter implements Converter<String, Date> {
private static final List<Entry> formatList = new ArrayList<>();
static {
formatList.add(new Entry("yyyy-MM-dd", "^\\d{4}-\\d{1,2}-\\d{1,2}$"));
formatList.add(new Entry("yyyy-MM-dd HH:mm", "^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}$"));
formatList.add(new Entry("yyyy-MM-dd HH:mm:ss", "^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$"));
}
@Override
public Date convert(String source) {
String value = source.trim();
if ("".equals(value)) {
return null;
}
if (source.matches(formatList.get(0).value)) {
return parseDate(source, formatList.get(0).key);
} else if (source.matches(formatList.get(1).value)) {
return parseDate(source, formatList.get(1).key);
} else if (source.matches(formatList.get(2).value)) {
return parseDate(source, formatList.get(2).key);
} else if (isTimestamp(source)) {//long 時間戳轉換
return parseDate(source, null);
} else {
throw new IllegalArgumentException("Invalid boolean value '" + source + "'");
}
}
/**
* 格式化日期
*
* @param dateStr String 字符型日期
* @param format String 格式
* @return Date 日期
*/
public Date parseDate(String dateStr, String format) {
Date date = null;
//long 時間戳轉換
if (isTimestamp(dateStr)) {
long time = Long.parseLong(dateStr);
return new Date(time);
}
try {
DateFormat dateFormat = new SimpleDateFormat(format);
date = dateFormat.parse(dateStr);
} catch (Exception e) {
log.error("時間轉換錯誤:{}", e.getMessage());
}
return date;
}
public static boolean isNumeric(String str) {
Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
return pattern.matcher(str).matches();
}
public static boolean isTimestamp(String str) {
return str != null && str.length() == 13 && isNumeric(str);
}
static class Entry {
String key;
String value;
public Entry(String key, String value) {
this.key = key;
this.value = value;
}
}
}