Gson 无法正确序列化/反序列化日期

zjf*_*fdu 2 java gson

奇怪的是,下面的测试用例会失败。有谁知道为什么?

Gson gson = new GsonBuilder()
    .setDateFormat("yyyy-MM-dd hh:mm:ss.SSS")
    .create();
Date date = new Date();
String json = gson.toJson(date);
System.out.println(date);
Date date2 = gson.fromJson(json, Date.class);
System.out.println(date2);
assertEquals(date2, date);
Run Code Online (Sandbox Code Playgroud)

Lyu*_*riv 5

发生这种情况是因为一些数据丢失,并且默认java.util.Date构造函数对毫秒敏感,但默认的 Gson 日期/时间格式配置(您可能正在使用它)忽略了毫秒。只需比较以确保:

System.out.println(date.getTime());
System.out.println(date2.getTime());
Run Code Online (Sandbox Code Playgroud)

默认的 Gson 日期/时间序列化器(不是反序列化器)格式DateTimeAdapter.enUsFormat(从 Gson 2.8.0 开始)不包括迄今为止的毫秒数 JSON 表示。要克服这种行为,您只需定义一个模式,该模式将尊重所有时间值,包括毫秒:

private static final Gson gson = new GsonBuilder()
        .setDateFormat("yyyy-MM-dd hh:mm:ss.SSS")
        .create();
Run Code Online (Sandbox Code Playgroud)

更新 #1

有一个错字。yyyy-MM-dd hh:mm:ss.SSS从 00:00 到 11:59 工作,但从 12:00 到 23:59 失败。我早上测试了它,所以我没有注意到我错了。:) 更准确的格式是yyyy-MM-dd HH:mm:ss.SSS--HH表示 00..23 范围内的小时:

.setDateFormat("yyyy-MM-dd HH:mm:ss.SSS")
Run Code Online (Sandbox Code Playgroud)