设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间18 现在时间18 缓存数据 从头到尾 我要的只有感情 可没人能给我

从头到尾 我要的只有感情 可没人能给我 -- 情深深雨濛濛

查看: 1139|回复: 2

springboot日期格式化全局LocalDateTime详解

[复制链接]

  离线 

TA的专栏

  • 打卡等级:即来则安
  • 打卡总天数:22
  • 打卡月天数:0
  • 打卡总奖励:288
  • 最近打卡:2025-07-08 07:10:04
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
390
主题
358
精华
0
金钱
1432
积分
796
注册时间
2023-2-10
最后登录
2025-7-8

发表于 2025-2-17 18:14:06 | 显示全部楼层 |阅读模式
目录
  • 分析
    • ObjectMapper与JsonSerializer
    • 结论
  • 自定义日期格式(全局)
    • 扩展
      • 利用配置文件指定java.util.Date类型的格式化
      • 利用注解指定时间格式化(局部)
    • 总结

      springboot 默认使用

      1. ObjectMapper
      复制代码
      (jackson)操作对象的序列化和反序列化

      分析

      从springboot:3.2.1 web 项目序列化响应体的过程中分析日期格式化问题(左侧是请求处理流程,右侧是在流程中使用的一些对象的来源)

      1.png

      ObjectMapper与JsonSerializer

      根据上述流程可知,序列化响应结果时使用的

      1. ObjectMapper
      复制代码
      对象是由自动配置类
      1. JacksonAutoConfiguratioin.JacksonObjectMapperConfiguration
      复制代码
      使用
      1. Jackson2ObjectMapperBuilder
      复制代码
      创建,并注册到
      1. beanfactory
      复制代码
      中。

      2.png

      创建ObjectMapper对象

      3.png

      设置ObjectMapper对象的属性

      1. Jackson2ObjectMapperBuilder#build
      复制代码
      方法中创建了
      1. ObjectMapper
      复制代码
      对象,然后在
      1. Jackson2ObjectMapperBuilder#configure
      复制代码
      方法中对
      1. ObjectMapper
      复制代码
      对象设置了一些属性。

      例如创建

      1. JavaTimeModule
      复制代码
      对象并将其注册给
      1. ObjectMapper
      复制代码
      , 正是在
      1. JavaTimeModule
      复制代码
      的构造方法中指定了
      1. LocalDateTime
      复制代码
      的序列化器使用
      1. com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer
      复制代码
      ,并将这种关系使用
      1. ObjectMapper#registerModules
      复制代码
      注册给
      1. ObjectMapper
      复制代码
      对象

      4.png

      在以下方法中创建了

      1. com.fasterxml.jackson.datatype.jsr310.JavaTimeModule
      复制代码
      对象

      1. private void registerWellKnownModulesIfAvailable(MultiValueMap<Object, Module> modulesToRegister) {
      2. // ...
      3. try {
      4. Class<? extends Module> javaTimeModuleClass = (Class<? extends Module>)
      5. ClassUtils.forName("com.fasterxml.jackson.datatype.jsr310.JavaTimeModule", this.moduleClassLoader);
      6. Module javaTimeModule = BeanUtils.instantiateClass(javaTimeModuleClass);
      7. modulesToRegister.set(javaTimeModule.getTypeId(), javaTimeModule);
      8. }
      9. catch (ClassNotFoundException ex) {
      10. // jackson-datatype-jsr310 not available
      11. }
      12. // ...
      13. }
      复制代码

      在JavaTimeModule类的构造函数中设置了

      1. LocalDateTime
      复制代码
      类型和该类型使用的序列化器
      1. LocalDateTimeSerializer
      复制代码
      和反序列化器
      1. LocalDateTimeDeserializer
      复制代码
      的对应关系

      5.png

      结论

      springboot项目中,使用从beanfactory中获取的

      1. ObjectMapper
      复制代码
      序列化对象时,若对象的字段类型是
      1. LocalDateTime
      复制代码
      ,则使用
      1. com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer
      复制代码
      对字段进行序列化,但是其默认的日期格式并不是我们想要的。

      6.png

      因此需要干涉上述流程,使用自定义的日期时间格式

      7.png

      自定义日期格式(全局)

      1.直接操作spring容器中的

      1. ObjectMapper
      复制代码
      bean

      利用

      1. ObjectMapper#registerModule
      复制代码

      2.自定义容器中的

      1. Jackson2ObjectMapperBuilder
      复制代码
      bean,达到间接操作ObjectMapper的目的

      从流程图中可知,容器中的

      1. ObjectMapper
      复制代码
      对象由
      1. Jackson2ObjectMapperBuilder
      复制代码
      创建(创建者模式),因此自定义
      1. Jackson2ObjectMapperBuilder
      复制代码
      的属性,会间接作用到
      1. ObjectMapper
      复制代码
      的属性

      根据

      1. JacksonAutoConfiguration.JacksonObjectMapperBuilderConfiguration
      复制代码
      源码可知,创建一个
      1. Jackson2ObjectMapperBuilderCustomizer
      复制代码
      实现类,并将其注入到容器中,可对容器中的
      1. Jackson2ObjectMapperBuilder
      复制代码
      bean进行自定义配置

      8.png

      按照上述思路实现如下(真实工作中需考虑多个customizer的顺序)

      9.png

      也可以使用modulesToInstall方法

      10.png

      3.向容器中注入

      1. com.fasterxml.jackson.databind.Module
      复制代码
      的实现类

      这是因为springboot自动配置包中已经提供了一个

      1. Jackson2ObjectMapperBuilderCustomizer
      复制代码
      实现类,在创建该实现类对象时,它将从容器中获取的
      1. com.fasterxml.jackson.databind.Module
      复制代码
      bean用于自定义配置
      1. Jackson2ObjectMapperBuilder
      复制代码

      11.png

      同时,可以看到

      1. StandardJackson2ObjectMapperBuilderCustomizer
      复制代码
      类使用了
      1. JacksonProperties
      复制代码
      的配置,也就说可以在配置文件中做些定义的配置

      12.png

      扩展

      利用配置文件指定java.util.Date类型的格式化

      1. spring:
      2. jackson:
      3. date-format: yyyy-MM-dd HH:mm:ss
      4. time-zone: GMT+8
      复制代码

      这种方式对

      1. java.time.LocalDateTime
      复制代码
      类型无效

      利用注解指定时间格式化(局部)

      1. @JsonFormat
      复制代码
      ,对
      1. java.util.Date
      复制代码
      1. java.time.LocalDateTime
      复制代码
      都有效

      13.png

        1. @JsonSerialize
        复制代码
        1. @JsonDeserialize
        复制代码
        ,指定使用的序列化器
        1. @DateTimeFormat
        复制代码
        1. @JsonComponent
        复制代码

      总结

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持晓枫资讯。


      免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
      晓枫资讯-科技资讯社区-免责声明
      免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
            1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
            2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
            3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
            4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
            5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
      http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

        离线 

      TA的专栏

      等级头衔

      等級:晓枫资讯-列兵

      在线时间
      0 小时

      积分成就
      威望
      0
      贡献
      0
      主题
      0
      精华
      0
      金钱
      11
      积分
      2
      注册时间
      2024-10-6
      最后登录
      2024-10-6

      发表于 2025-8-26 22:17:12 | 显示全部楼层
      感谢楼主,顶。
      http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

        离线 

      TA的专栏

      • 打卡等级:无名新人
      • 打卡总天数:1
      • 打卡月天数:0
      • 打卡总奖励:7
      • 最近打卡:2025-08-27 06:23:06
      等级头衔

      等級:晓枫资讯-列兵

      在线时间
      0 小时

      积分成就
      威望
      0
      贡献
      0
      主题
      0
      精华
      0
      金钱
      19
      积分
      4
      注册时间
      2025-1-6
      最后登录
      2025-8-27

      发表于 2025-9-8 10:38:12 | 显示全部楼层
      路过,支持一下
      http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
      严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
      您需要登录后才可以回帖 登录 | 立即注册

      本版积分规则

      1楼
      2楼
      3楼

      手机版|晓枫资讯--科技资讯社区 本站已运行

      CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

      晓枫资讯--科技资讯社区

      本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

      如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

      Powered by Discuz! X3.5

      快速回复 返回顶部 返回列表