Selaa lähdekoodia

feat: 配置统一各服务时区及时间格式化,兼容多格式时间传入

hidewnd 3 viikkoa sitten
vanhempi
commit
5c09eef775

+ 31 - 0
yt-agent/agent-service/src/main/java/com/ytpm/config/JacksonConfig.java

@@ -0,0 +1,31 @@
+package com.ytpm.config;
+
+
+import com.ytpm.handle.CustomDateSerializer;
+import com.ytpm.handle.MultiFormatDateDeserializer;
+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 java.util.Date;
+
+/**
+ * @author lih
+ * @date 2025-10-14 11:06
+ */
+@Configuration
+public class JacksonConfig {
+
+    @Value("${spring.jackson.time-zone:Asia/Shanghai}")
+    private String timeZone;
+
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer customJacksonConfig() {
+        return builder -> {
+            // 注册Date类型的序列化器和反序列化器
+            builder.serializerByType(Date.class, new CustomDateSerializer(timeZone));
+            builder.deserializerByType(Date.class, new MultiFormatDateDeserializer(timeZone));
+        };
+    }
+}

+ 42 - 0
yt-common/src/main/java/com/ytpm/handle/CustomDateSerializer.java

@@ -0,0 +1,42 @@
+package com.ytpm.handle;
+
+
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.TimeZone;
+
+/**
+ * 自定义Date序列化器(输出东八区yyyy-MM-dd HH:mm:ss格式)
+ * @author lih
+ * @date 2025-10-15 10:21
+ */
+public class CustomDateSerializer extends StdSerializer<Date> {
+
+    private static String defaultTimeZone;
+
+    public CustomDateSerializer(String timeZone) {
+        super(Date.class);
+        defaultTimeZone = timeZone;
+    }
+
+    // 线程安全的SimpleDateFormat(避免多线程问题)
+    private static final ThreadLocal<SimpleDateFormat> SDF_THREAD_LOCAL = ThreadLocal.withInitial(() -> {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        sdf.setTimeZone(TimeZone.getTimeZone(defaultTimeZone));
+        return sdf;
+    });
+
+
+    @Override
+    public void serialize(Date value, JsonGenerator gen, SerializerProvider provider) throws IOException {
+        if (value != null) {
+            // 使用线程安全的DateFormat格式化
+            gen.writeString(SDF_THREAD_LOCAL.get().format(value));
+        }
+    }
+}

+ 60 - 0
yt-common/src/main/java/com/ytpm/handle/MultiFormatDateDeserializer.java

@@ -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);
+    }
+
+}

+ 31 - 0
yt-novel/yt-novel-service/src/main/java/com/ytpm/novel/config/JacksonConfig.java

@@ -0,0 +1,31 @@
+package com.ytpm.novel.config;
+
+
+import com.ytpm.handle.CustomDateSerializer;
+import com.ytpm.handle.MultiFormatDateDeserializer;
+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 java.util.Date;
+
+/**
+ * @author lih
+ * @date 2025-10-14 11:06
+ */
+@Configuration
+public class JacksonConfig {
+
+    @Value("${spring.jackson.time-zone:Asia/Shanghai}")
+    private String timeZone;
+
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer customJacksonConfig() {
+        return builder -> {
+            // 注册Date类型的序列化器和反序列化器
+            builder.serializerByType(Date.class, new CustomDateSerializer(timeZone));
+            builder.deserializerByType(Date.class, new MultiFormatDateDeserializer(timeZone));
+        };
+    }
+}

+ 31 - 0
yt-risk/risk-manage/src/main/java/com/ytpm/config/JacksonConfig.java

@@ -0,0 +1,31 @@
+package com.ytpm.config;
+
+
+import com.ytpm.handle.CustomDateSerializer;
+import com.ytpm.handle.MultiFormatDateDeserializer;
+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 java.util.Date;
+
+/**
+ * @author lih
+ * @date 2025-10-15 10:22
+ */
+@Configuration
+public class JacksonConfig {
+
+    @Value("${spring.jackson.time-zone:Asia/Shanghai}")
+    private String timeZone;
+
+    @Bean
+    public Jackson2ObjectMapperBuilderCustomizer customJacksonConfig() {
+        return builder -> {
+            // 注册Date类型的序列化器和反序列化器
+            builder.serializerByType(Date.class, new CustomDateSerializer(timeZone));
+            builder.deserializerByType(Date.class, new MultiFormatDateDeserializer(timeZone));
+        };
+    }
+}