• SpringBoot - @JsonFormat注解详解


    写在前面

    @JsonFormat注解是一个时间格式化注解,用于格式化时间。
    比如存储在MYSQL中的数据是dateTime类型,将数据获取以后封装到实体类中的时候,就会变成英文的时间格式(Wed Jul 27 02:26:43 CST 2022),而不是yyyy-MM-dd HH:mm:ss格式的时间(2022-07-27 02:26:43),@JsonFormat注解就可以解决这个问题。

    一句话说明

    A. 该注解用于出参日期数据的时间格式化。
    B. 那么入参日期数据的格式如何处理呢?也用同样的方案。
    如果前端传来的为字符串格式的日期:“2022年07月29日 09时41分22秒”,则需要如下配置:
    @JsonFormat(pattern = “yyyy年MM月dd日 HH时mm分ss秒”)
    private Date createTime;
    解析后存入DB中的则为:2022-07-29 09:41:22,查询时返回的数据则为:“2022年07月29日 09时41分22秒”

    如何使用?

    ① 引入依赖

    @JsonFormat注解不是SPRING自带的注解,所以使用该注解前需要添加jackson相关的依赖包。当然如果是 SpringBoot项目就不需要自己手动添加依赖了,因为在spring-boot-start-web下已经包含了jackson的相关依赖了。

    
    <dependency>
        <groupId>com.fasterxml.jackson.coregroupId>
        <artifactId>jackson-databindartifactId>
        <version>2.12.6version>
    dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    ② 添加注解

    在实体类属性上面使用@JsonFormat注解。

    /**
    * 创建时间
    */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    
    /**
    * 更新时间
    */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    ③ 注意事项

    只是在将实体返回JSON格式数据时才有效的转换为(yyyy-MM-dd HH:mm:ss)格式的时间,其他时候日期格式不会被转换。

    相差8小时

    JASKSON在序列化时间时是按照国际标准时间GMT进行格式化的,而在国内默认时区使用的是CST时区,两者相差8小时,因为我们是东八区(北京时间),所以我们在格式化的时候要指定时区(timezone)。

    中国时间(Asia/Shanghai) = 格林尼治时间(GMT)+ 8
    格林尼治时间(GMT) = 世界协调时间(UTC) + 0

    /**
    * 创建时间
    */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
    private Date createTime;
    
    /**
    * 更新时间
    */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
    private Date updateTime;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    时区概念

    GMT(格林尼治时间),Greenwich Mean Time ,这是以英国格林尼治天文台观测结果得出的时间,这是英国格林尼治这个地方的时间,是过去使用的世界标准的时间;

    UT(世界时),Universal Time ,这是根据原子钟计算出来的时间。

    UTC(世界协调时间),Coordinated Universal Time,因为地球自转越来越慢,每年都会比前一年多出零点几秒,每隔几年,协调世界时组织委员会都会给世界时+1秒,让基于原子钟的世界时和基于天文学的格林尼治标准时间相差不至于太大,是现在使用的世界标准时间。

    协调世界时不与任何地区位置相关,也不代表此刻某个地区的时间,所以在说明某地时间时要加上时区。
    也就是说:GMT并不等于UTC,而是等于UTC+0,只是格林尼治刚好在0时区上。

    A. 中国时间(Asia/Shanghai) = 格林尼治时间(GMT)+ 8
    B. 格林尼治时间(GMT) = 世界协调时间(UTC) + 0

    数据库的时区设置

    url: jdbc:mysql://localhost:3306/servicex-single?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8

    源码说明

    @Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @JacksonAnnotation
    public @interface JsonFormat {
        String DEFAULT_LOCALE = "##default";
        String DEFAULT_TIMEZONE = "##default";
    
    	// 表示序列化后日期的格式,比如:yyyy-MM-dd HH:mm:ss 或者 yyyy年MM月dd日 HH时mm分ss秒
        String pattern() default "";
    	// 表示序列化后的一种类型,默认为JsonFormat.Shape.ANY
        JsonFormat.Shape shape() default JsonFormat.Shape.ANY; 
    	// 根据位置序列化的一种格式,默认为本地的语言简称,中国的语言简称为zh_CN
        String locale() default "##default";
    	// 指定时区,默认是GMT,北京时间为:GMT+8
        String timezone() default "##default";
    
        OptBoolean lenient() default OptBoolean.DEFAULT;
    
        JsonFormat.Feature[] with() default {};
    
        JsonFormat.Feature[] without() default {};
       ...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
  • 相关阅读:
    Dockerfile
    大数据:【学习笔记系列】Flink基础架构
    基于 Vite + Vue3 的组件库打包并发布到npm
    SpringBoot项目基础设施搭建
    java中Collection.stream()流用法详解
    Java项目:SSM医院分诊管理系统
    【已解决】AttributeError: module ‘numpy‘ has no attribute ‘int‘.
    2022-08-07 集合拓展---遍历
    react 项目打包优化记录
    Spring bean 的生命周期(总结)
  • 原文地址:https://blog.csdn.net/goodjava2007/article/details/126028371