Jackson 使用 @JsonFormat 注解进行时间格式化

简介: 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 的时区问题。。。。


标签: 异常

目录
相关文章
|
JSON Java 数据格式
SpringBoot 使用 jackson 格式化时间
在实际开发中我们经常会与时间打交道,那这就会涉及到一个时间格式转换的问题。接下来会介绍几种在SpirngBoot中如何对时间格式进行转换。
712 2
|
前端开发 网络协议 JavaScript
在Spring Boot中实现基于WebSocket的实时通信
在Spring Boot中实现基于WebSocket的实时通信
|
Arthas 测试技术 网络安全
The telnet port 3658 is used by process
是否在本地使用Arthas的时候,遇到The telnet port 3658 is used by process 34725 instead of target process 44848, you will connect to an unexpected process的异常,其实解决方法很简单。
2416 0
The telnet port 3658 is used by process
|
SQL 监控 druid
p6spy【SpringBoot集成】使用p6spy-spring-boot-starter集成p6spy监控数据库(配置方法举例)
p6spy【SpringBoot集成】使用p6spy-spring-boot-starter集成p6spy监控数据库(配置方法举例)
2936 0
|
存储 监控 Java
OpenFeign请求拦截器组件RequestInterceptor原理与使用场景
该文章讲述了OpenFeign中的请求拦截器组件RequestInterceptor的原理及其常见使用场景。
OpenFeign请求拦截器组件RequestInterceptor原理与使用场景
|
Java
java将输入的数字金额转换为中文大写金额
java将输入的数字金额转换为中文大写金额
1228 1
|
Java 数据安全/隐私保护 Spring
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
揭秘Spring Boot自定义注解的魔法:三个实用场景让你的代码更加优雅高效
|
Docker 容器 Perl
在Docker中,如何清理后台停止的容器?
在Docker中,如何清理后台停止的容器?
|
JSON Java 数据格式
Spring Boot 中的 @DateTimeFormat 和 @JsonFormat 的用法及作用
【6月更文挑战第11天】在开发 Spring Boot 应用时,处理日期和时间数据是一个常见的需求。Spring Boot 提供了两个注解 @DateTimeFormat 和 @JsonFormat 来帮助我们处理这些问题。
958 4
|
前端开发 Java Maven
springboot优雅的实现excel的导出(自适应列宽实现,中文也行),复制可用
springboot优雅的实现excel的导出(自适应列宽实现,中文也行),复制可用
757 0