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

时间:2017-04-21 01:44:42

标签: 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);

1 个答案:

答案 0 :(得分:3)

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

System.out.println(date.getTime());
System.out.println(date2.getTime());

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

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

更新#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")