refactor(json): OffsetDateTime 序列化统一秒精度, 移除纳秒小数

原 ISO_OFFSET_DATE_TIME 会按纳秒值输出 0-9 位小数 (如 .0546373),
对支付场景秒级足够, 且纳秒精度视觉混乱、增加字符串长度、不符行业惯例。

改用自定义 formatter 'yyyy-MM-dd'T'HH:mm:ssXXX' 强制秒精度无小数。
反序列化器仍兼容各种精度输入, 商户 SDK 不受影响。
This commit is contained in:
DaxPay Dev
2026-07-20 08:21:56 +08:00
parent 0fec965c06
commit cef8c773c1

View File

@@ -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<OffsetDateTime> {
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));