本文为博主原创,未经允许不得转载:

  最近帮同事定位了一个现网问题,记录一下:

    项目中对所有请求的参数都进行了 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 的时区问题。。。。