From cef8c773c146f30a22207159d3314ff51b5ebf97 Mon Sep 17 00:00:00 2001 From: DaxPay Dev Date: Mon, 20 Jul 2026 08:21:56 +0800 Subject: [PATCH] =?UTF-8?q?refactor(json):=20OffsetDateTime=20=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8C=96=E7=BB=9F=E4=B8=80=E7=A7=92=E7=B2=BE=E5=BA=A6?= =?UTF-8?q?,=20=E7=A7=BB=E9=99=A4=E7=BA=B3=E7=A7=92=E5=B0=8F=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原 ISO_OFFSET_DATE_TIME 会按纳秒值输出 0-9 位小数 (如 .0546373), 对支付场景秒级足够, 且纳秒精度视觉混乱、增加字符串长度、不符行业惯例。 改用自定义 formatter 'yyyy-MM-dd'T'HH:mm:ssXXX' 强制秒精度无小数。 反序列化器仍兼容各种精度输入, 商户 SDK 不受影响。 --- .../platform/common/json/jdk/Java8TimeFormatModule.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/daxpay-platform/daxpay-platform-common/common-json/src/main/java/cn/daxpay/open/platform/common/json/jdk/Java8TimeFormatModule.java b/daxpay-platform/daxpay-platform-common/common-json/src/main/java/cn/daxpay/open/platform/common/json/jdk/Java8TimeFormatModule.java index 4363e7e1b..0595b95ad 100644 --- a/daxpay-platform/daxpay-platform-common/common-json/src/main/java/cn/daxpay/open/platform/common/json/jdk/Java8TimeFormatModule.java +++ b/daxpay-platform/daxpay-platform-common/common-json/src/main/java/cn/daxpay/open/platform/common/json/jdk/Java8TimeFormatModule.java @@ -17,7 +17,7 @@ import java.time.format.DateTimeFormatter; /// # Java 8 时间类型格式定制模块 /// /// Jackson 3 内置了时间类型支持, 此模块仅覆盖默认的序列化格式 -/// OffsetDateTime -> yyyy-MM-ddTHH:mm:ssZ (UTC) +/// OffsetDateTime -> yyyy-MM-ddTHH:mm:ssZ (UTC, 秒精度无小数) /// LocalDate -> yyyy-MM-dd /// LocalTime -> HH:mm:ss public class Java8TimeFormatModule extends SimpleModule { @@ -34,7 +34,11 @@ public class Java8TimeFormatModule extends SimpleModule { } static class OffsetDateTimeToStringSerializer extends ValueSerializer { - private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ISO_OFFSET_DATE_TIME; + // 秒精度 ISO 8601 偏移时间格式, 避免纳秒级精度输出 (如 .0546373) 造成视觉混乱与协议冗余 + // 支付场景秒级足够, 符合行业惯例 (Stripe / 微信支付 / 支付宝) + private static final DateTimeFormatter FORMATTER = + DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX"); + @Override public void serialize(OffsetDateTime value, JsonGenerator gen, SerializationContext ctxt) throws JacksonException { gen.writeString(value.withOffsetSameInstant(ZoneOffset.UTC).format(FORMATTER));