Java 反序列化后,Jackson日期会随时区进行调整

Java 反序列化后,Jackson日期会随时区进行调整,java,json,jackson,Java,Json,Jackson,我正在尝试反序列化一个JSON文件,并将其用于单元测试。但由于值不匹配,测试失败。 当我查看日志时,我从反序列化对象获得的时间比我预期的晚了8个小时。我认为它将我的时区应用于该值(GMT+8)。 如果我在JSON文件中将时间设置为8小时,测试就通过了。但是我想得到没有时区的正确时间,这样我就不必使我的数据依赖于时区 以下是一些示例代码: result.JSON { "userId" : 1, "lastVisit" : 1546300800000 } testUserData.

我正在尝试反序列化一个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);
}
import java.util.Date;

public int userId;
public Date lastVisit;

public UserData(int userId, long lastVisitTime) {
    this.userId = userId;
    this.lastVisit = new Date(lastVisitTime);
}
UserData.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);
}
import java.util.Date;

public int userId;
public Date lastVisit;

public UserData(int userId, long lastVisitTime) {
    this.userId = userId;
    this.lastVisit = new Date(lastVisitTime);
}
单元测试日志(摘录):


设置需要反序列化的
时区

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

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

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

当我调用getDeserializationConfig().getTimeZone()时,我可以看到时区确实是UTC,但生成的时间仍然是经过调整的时间。最后,我使用setDateFormat(新的SimpleDateFormat(“yyyy-MM-dd'T'HH:MM:ss”))设置了一种日期格式,而没有设置时区,并且使用字符串日期而不是UNIX时间,这样就可以了。