反序列化后,Jackson Date会根据时区进行调整

时间:2019-07-19 06:42:59

标签: java json jackson

我正在尝试反序列化JSON文件并将其用于单元测试。但是由于值不匹配,测试失败。 当我查看日志时,从反序列化对象获得的时间比我期望的晚了8个小时。我认为它将我的时区应用于值(GMT + 8)。 如果我在JSON文件中将时间设置为早8小时,则测试通过。但是我想获得没有时区的正确时间,这样我就不必使数据依赖时区。

以下是一些示例代码: result.JSON

{
    "userId" : 1,
    "lastVisit" : 1546300800000
}

testUserData.java

public void checkUserData() throws Exception {
    ObjectMapper om = new ObjectMapper();
    UserData expected = om.readValue(new File("result.JSON"), UserData.class);
    long lastVisit = 1546300800 * 1000; //2019-01-01 00:00:00 in millisecond
    UserData actual = new UserData(1, lastVisit);
    ReflectionAssert.assertReflectionEquals(expected, actual);
}

UserData.java

import java.util.Date;

public int userId;
public Date lastVisit;

public UserData(int userId, long lastVisitTime) {
    this.userId = userId;
    this.lastVisit = new Date(lastVisitTime);
}

单元测试日志(摘录):

--- Found following differences ---
lastVisit: expected: Tue Jan 01 08:00:00 CST 2019, actual: 2019-01-01

2 个答案:

答案 0 :(得分:1)

TimeZone设置为需要反序列化的区域日期

ObjectMapper mapper = new ObjectMapper();
mapper.setTimeZone(TimeZone.getTimeZone(ZoneOffset.UTC));

答案 1 :(得分:0)

我自己找到了答案。 我已经尝试按照答案中的建议设置时区,但是没有用。 对于那些有相同问题的人,我通过设置日期格式而不是设置时区来解决此问题,并使用字符串日期而不是UNIX时间:

mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"));