From a725fd6c3b17c738efe9e4a42426f5f9fd1878ca Mon Sep 17 00:00:00 2001 From: shixiaohe Date: Wed, 27 Nov 2024 20:52:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0LocalTime=20=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96=E5=95=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TimestampLocalTimeDeserializer.java | 34 +++++++++++++++++ .../TimestampLocalTimeSerializer.java | 37 +++++++++++++++++++ .../config/YudaoJacksonAutoConfiguration.java | 9 +++-- 3 files changed, 76 insertions(+), 4 deletions(-) create mode 100644 yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalTimeDeserializer.java create mode 100644 yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/json/databind/TimestampLocalTimeSerializer.java 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));