|
|
@@ -0,0 +1,60 @@
|
|
|
+package com.ytpm.handle;
|
|
|
+
|
|
|
+
|
|
|
+import com.fasterxml.jackson.core.JsonParser;
|
|
|
+import com.fasterxml.jackson.databind.DeserializationContext;
|
|
|
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
|
|
|
+
|
|
|
+import java.io.IOException;
|
|
|
+import java.text.ParseException;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+import java.util.TimeZone;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 兼容多种格式的Date反序列化器
|
|
|
+ *
|
|
|
+ * @author lih
|
|
|
+ * @date 2025-10-14 11:04
|
|
|
+ */
|
|
|
+public class MultiFormatDateDeserializer extends StdDeserializer<Date> {
|
|
|
+
|
|
|
+ private static String defaultTimeZone;
|
|
|
+
|
|
|
+ // 需要兼容的时间格式(按优先级排序)
|
|
|
+ private static final List<String> SUPPORT_FORMATS = Arrays.asList(
|
|
|
+ "yyyy-MM-dd'T'HH:mm:ss.SSSZ", // 对应 2025-10-11T11:21:19.000+0800
|
|
|
+ "yyyy-MM-dd HH:mm:ss", // 对应 2025-10-11 11:21:19
|
|
|
+ "yyyy-MM-dd" // 对应 2025-10-11
|
|
|
+ );
|
|
|
+
|
|
|
+ public MultiFormatDateDeserializer(String timeZone) {
|
|
|
+ super(Date.class);
|
|
|
+ defaultTimeZone = timeZone;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Date deserialize(JsonParser parser, DeserializationContext context) throws IOException {
|
|
|
+ String dateStr = parser.getValueAsString();
|
|
|
+ if (dateStr == null || dateStr.trim().isEmpty()) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 尝试每种格式解析,成功则返回
|
|
|
+ for (String format : SUPPORT_FORMATS) {
|
|
|
+ try {
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat(format);
|
|
|
+ sdf.setTimeZone(TimeZone.getTimeZone(defaultTimeZone));
|
|
|
+ return sdf.parse(dateStr);
|
|
|
+ } catch (ParseException e) {
|
|
|
+ // 解析失败,继续尝试下一种格式
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 所有格式都不匹配时抛出异常
|
|
|
+ throw new IOException("不支持的时间格式: " + dateStr + ",请使用以下格式:" + SUPPORT_FORMATS);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|