diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalTimeDeserializer.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalTimeDeserializer.java new file mode 100644 index 0000000000..5816cf4bfc --- /dev/null +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalTimeDeserializer.java @@ -0,0 +1,34 @@ +package cn.iocoder.yudao.framework.common.util.json.databind; + +import com.fasterxml.jackson.core.JsonParser; +import com.fasterxml.jackson.databind.DeserializationContext; +import com.fasterxml.jackson.databind.JsonDeserializer; + +import java.io.IOException; +import java.time.Instant; +import java.time.LocalTime; +import java.time.ZoneId; +import java.time.ZonedDateTime; + +/** + * 基于时间戳的 LocalTime 反序列化器 + * + * @author shixiaohe + */ +public class TimestampLocalTimeDeserializer extends JsonDeserializer { + + public static final TimestampLocalTimeDeserializer INSTANCE = new TimestampLocalTimeDeserializer(); + + @Override + public LocalTime deserialize(JsonParser p, DeserializationContext ctxt) throws IOException { + // 从时间戳转换为 Instant + Instant instant = Instant.ofEpochMilli(p.getValueAsLong()); + + // 转换为 ZonedDateTime 或 LocalDateTime + ZonedDateTime zonedDateTime = instant.atZone(ZoneId.systemDefault()); + + // 提取时间部分 + return zonedDateTime.toLocalTime(); + } + +} diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalTimeSerializer.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalTimeSerializer.java new file mode 100644 index 0000000000..0a9e2f9bf1 --- /dev/null +++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalTimeSerializer.java @@ -0,0 +1,37 @@ +package cn.iocoder.yudao.framework.common.util.json.databind; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.ZoneId; + +/** + * 基于时间戳的 LocalTime 序列化器 + * + * @author shixiaohe + */ +public class TimestampLocalTimeSerializer extends JsonSerializer { + + public static final TimestampLocalTimeSerializer INSTANCE = new TimestampLocalTimeSerializer(); + + @Override + public void serialize(LocalTime value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + // 获取当前日期 + LocalDate today = LocalDate.now(); + + // 将 LocalTime 和日期合并为 LocalDateTime + LocalDateTime localDateTime = LocalDateTime.of(today, value); + + // 转换为时间戳(毫秒) + long timestamp = localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli(); + + // 写入时间戳 + gen.writeNumber(timestamp); + } + +} diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/config/YudaoJacksonAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/config/YudaoJacksonAutoConfiguration.java index c62f0a0300..825443dfc2 100644 --- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/config/YudaoJacksonAutoConfiguration.java +++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/jackson/config/YudaoJacksonAutoConfiguration.java @@ -2,9 +2,7 @@ package cn.iocoder.yudao.framework.jackson.config; import cn.hutool.core.collection.CollUtil; import cn.iocoder.yudao.framework.common.util.json.JsonUtils; -import cn.iocoder.yudao.framework.common.util.json.databind.NumberSerializer; -import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeDeserializer; -import cn.iocoder.yudao.framework.common.util.json.databind.TimestampLocalDateTimeSerializer; +import cn.iocoder.yudao.framework.common.util.json.databind.*; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; @@ -39,7 +37,10 @@ public class YudaoJacksonAutoConfiguration { .addDeserializer(LocalTime.class, LocalTimeDeserializer.INSTANCE) // 新增 LocalDateTime 序列化、反序列化规则,使用 Long 时间戳 .addSerializer(LocalDateTime.class, TimestampLocalDateTimeSerializer.INSTANCE) - .addDeserializer(LocalDateTime.class, TimestampLocalDateTimeDeserializer.INSTANCE); + .addDeserializer(LocalDateTime.class, TimestampLocalDateTimeDeserializer.INSTANCE) + // 新增 LocalTime 序列化、反序列化规则,使用 Long 时间戳 + .addSerializer(LocalTime.class, TimestampLocalTimeSerializer.INSTANCE) + .addDeserializer(LocalTime.class, TimestampLocalTimeDeserializer.INSTANCE); // 1.2 注册到 objectMapper objectMappers.forEach(objectMapper -> objectMapper.registerModule(simpleModule));