Jackson 时间反序列化时区问题解析与处理

  |   0 评论   |   2,146 浏览

测试环境:
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;
        }
    }

评论

发表评论


取消