本文为博主原创,未经允许不得转载:
最近帮同事定位了一个现网问题,记录一下:
项目中对所有请求的参数都进行了 Jackson 序列化,在接收请求的实体类字段上使用 @JsonFormat 注解,该注解的作用是将传入的时间格式化为 注解上指定的格式。在使用过程中 对 @JsonFormat 转换的字段与 string 日期字段转换为 date 类型的日期进行比较时,本来是相同的值,equal 比较时,返回结果为false。主要是由于使用 @JsonFormat 转换时,存在时区问题,才会导致异常。
使用@JsonFormat 进行格式化转换时,若未标明时区,则默认为 GMT 时区,年月日转换为date 时,会使用GMT 时区,会多 8 小时。若指定时区 timezone = “GMT+8” ,年月日字符串转换之后会是对应的北京时间的0点0分0秒。
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
封装一个测试类方法
package com.example.demo; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.Data; import java.util.Date; @Data public class JacksonTest { @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") private Date date; @JsonFormat(pattern="yyyy-MM-dd") private Date date2; public static void main(String[] args) throws JsonProcessingException { ObjectMapper objectMapper = new ObjectMapper(); String jsonStr = "{"date":"2021-02-02","date2":"2021-02-02"}"; JacksonTest test = objectMapper.readValue(jsonStr,JacksonTest.class); System.out.println(test.getDate()); System.out.println(test.getDate2()); } }
该方法执行打印的结果如下:
Tue Feb 02 00:00:00 CST 2021
Tue Feb 02 08:00:00 CST 2021
通过 jackson 转换之后,差了8小时。
所以在使用过程中,一定要 注意 @JsonFormat 的时区问题。。。。