zoukankan      html  css  js  c++  java
  • Jackson 使用 @JsonFormat 注解进行时间格式化

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

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

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

      

  • 相关阅读:
    Redis-Sentinel 哨兵
    virtualenv and virtualenvwrapper
    C/C++中extern关键字详解
    C++ 中文拼音排序方法。
    vector排序
    VS2013 Ctrl+Shift+F 没反应
    PostMessage 解析
    CTextUI 文本控件 显示数字方法
    SetTimer API函数
    CEditUI 控件使用
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/15187654.html
Copyright © 2011-2022 走看看