You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Gson 2.8序列化OffsetDateTime秒数格式异常问题求助

解决Gson序列化OffsetDateTime时秒数丢失的问题

这个问题我之前也碰到过,本质是Gson 2.8内置的OffsetDateTime序列化逻辑会自动省略秒数为0的部分——这是它默认格式化策略的特性,但显然不符合你的需求。下面给你两种实用的解决办法:

方法一:自定义TypeAdapter(无需额外依赖)

自己写一个专门处理OffsetDateTime的类型适配器,强制使用固定格式的日期时间字符串,确保无论秒数是否为0都保留完整结构:

import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonWriter;
import java.io.IOException;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

public class OffsetDateTimeTypeAdapter extends TypeAdapter<OffsetDateTime> {
    // 用ISO标准格式,严格保留所有时间部分
    private static final DateTimeFormatter FIXED_FORMAT = DateTimeFormatter.ISO_OFFSET_DATE_TIME;

    @Override
    public void write(JsonWriter out, OffsetDateTime value) throws IOException {
        if (value == null) {
            out.nullValue();
            return;
        }
        out.value(FIXED_FORMAT.format(value));
    }

    @Override
    public OffsetDateTime read(JsonReader in) throws IOException {
        String dateStr = in.nextString();
        return dateStr == null || dateStr.isEmpty() ? null : OffsetDateTime.parse(dateStr, FIXED_FORMAT);
    }
}

然后在创建Gson实例的时候注册这个适配器:

Gson gson = new GsonBuilder()
        .registerTypeAdapter(OffsetDateTime.class, new OffsetDateTimeTypeAdapter())
        .create();

测试后你会发现,当序列化orderTime为2018-05-02T14:23:00Z时,就能得到预期的"2018-05-02T14:23:00Z"了。

方法二:借助gson-java8扩展库(更简洁)

如果你愿意引入额外依赖,可以用Gson官方提供的Java 8时间类型扩展库,直接配置格式化器:

先添加Maven依赖(版本要和你的Gson 2.8匹配,比如用2.8.8):

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson-java8</artifactId>
    <version>2.8.8</version>
</dependency>

然后配置Gson实例,指定固定的日期时间格式:

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        Gson gson = new GsonBuilder()
                .setDateFormat(DateTimeFormatter.ISO_OFFSET_DATE_TIME.toString())
                .create();
        
        // 测试序列化
        Order order = new Order();
        order.setOrderTime(OffsetDateTime.parse("2018-05-02T14:23:00Z"));
        String json = gson.toJson(order);
        System.out.println(json); // 输出预期的完整格式
    }
}

验证效果

不管你的orderTime秒数是0还是非0,序列化后的结果都会严格遵循yyyy-MM-dd'T'HH:mm:ssXXX格式,完全符合你的预期。


内容的提问来源于stack exchange,提问作者user1653027

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:34:05