Jackson 时间反序列化时区问题解析与处理
测试环境:
JacksonJson 版本:
<com_fasterxml_jackson_version>2.5.1</com_fasterxml_jackson_version>
<!-- fasterxml json used by spring (new) -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${com_fasterxml_jackson_version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${com_fasterxml_jackson_version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${com_fasterxml_jackson_version}</version>
</dependency>
先说结论:
如果不进行任何处理时.会按原时区进行时间戳输出
public static class VoWithDate3 {
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
public static void main(String[] args) {
Date now = new Date();
v3.setDate(now);
System.out.println("v3:\t" + new
ObjectMapper().writeValueAsString(v3));
}
// 原时间: 2019-07-08 01:30:28
// v3: {"date":1562520628862}
如果想要对日期输出进行格式化. 早期的JacksonJson
只有自定义序列化类进行处理.而较新的版本可以直接使用注解:
public static class VoWithDate {
// 反序列化 的时候. 这个是原时区
// 序列化 的时候. 输出的目标时区
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
可以再使用以上的测试代码进行输出:
public static void main(String[] args) {
Date now = new Date();
v1.setDate(now);
System.out.println("v1:\t" + new
ObjectMapper().writeValueAsString(v1));
}
// v1: {"date":"2019-07-07 17:30:28"}
public static class VoWithDate2 {
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+9", locale = "ja_JP")
private Date date;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8", locale = "en_GB")
private Date date1;
public Date getDate1() {
return date1;
}
public void setDate1(Date date1) {
this.date1 = date1;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}