@DateTimeFormat 与 @JsonFormat 的区别

  • @JsonFormat 是 jackson 对 json 数据进行格式化, 包含序列化和反序列化. 只与 json 有关.

  • @DateTimeFormat 是 spring 对日期格式的赋值进行格式化, 只包含反序列化. 作用是限制入参格式.

为什么要使用 @DateTimeFormat 限制呢?

  • 因为日期的表现形式有很多种, 如果不规定格式, 后端就不知道以何种格式接收, 就好比年月日和日月年.(默认按照UTC日期格式:''yyyy-MM-dd’T’HH:mm:ss.SSSX",但实测传入"yyyy-MM-d"也可以接收) 设置 @DateTimeFormat 该值之后, 就只能传该格式.
  • UTC日期格式对于前端极其不友好

在同时设置时 @DateTimeFormat 失效只匹配 @JsonFormat ?

  • 接下来就是关键的地方了, @JsonFormat 只与 json 有关. 所以当我们在处理 post 之类, 带有请求体为 json 的请求时, 在实际处理中 jackson 已经将该值处理了. 并没有通过 @DateTimeFormat 所以就会出现失效的问题.
  • @DateTimeFormat 本就对 json 格斯无效

结论

  • 两者主要根据请求的数据类型来对比

    • 请求非JSON数据,用@DateTimeFormat即可,比如get请求。
    • 请求JSON数据,用@ReqeustBody来转换数据,然后搭配局部注解@JsonFormat或者全局配置来修改默认的日期解析格式(默认为UTC日期格式:“yyyy-MM-dd’T’HH:mm:ss.SSSX”)

全局配置

  • Springboot
spring:# Content-Type 为 application/json, @JsonFormat(优先级高) 或 spring.jackson.date-formatjackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8# Content-Type 为 application/x-www-form-urlencoded(普通表单上传)spring.mvc.date-format(优先级高) 或 @DatetimeFormatmvc:format:date-time: yyyy-MM-dd HH:mm:ss

或 (支持 LocalDateTime)

  • Springboot (JsonFormat)
@Configuration
public class ContactAppConfig {private static final String dateFormat = "yyyy-MM-dd";private static final String dateTimeFormat = "yyyy-MM-dd HH:mm:ss";@Beanpublic Jackson2ObjectMapperBuilderCustomizer jsonCustomizer() {return builder -> {builder.simpleDateFormat(dateTimeFormat);builder.serializers(new LocalDateSerializer(DateTimeFormatter.ofPattern(dateFormat)));builder.serializers(new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(dateTimeFormat)));};}}
  • Springboot (DateTimeFormat) 官网
@Configuration
public class DateTimeConfig extends WebMvcConfigurationSupport {@Bean@Overridepublic FormattingConversionService mvcConversionService() {DefaultFormattingConversionService conversionService = new DefaultFormattingConversionService(false);DateTimeFormatterRegistrar dateTimeRegistrar = new DateTimeFormatterRegistrar();dateTimeRegistrar.setDateFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd"));dateTimeRegistrar.setDateTimeFormatter(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));dateTimeRegistrar.setTimeFormatter(DateTimeFormatter.ofPattern("HH:mm:ss"));dateTimeRegistrar.registerFormatters(conversionService);// DateFormatterRegistrar dateRegistrar = new DateFormatterRegistrar();// dateRegistrar.setFormatter(new DateFormatter("yyyy-MM-dd"));// dateRegistrar.registerFormatters(conversionService);return conversionService;}
}

@DateTimeFormat 与 @JsonFormat 的区别相关推荐

  1. 时间格式化问题@DateTimeFormat和@JsonFormat的区别

    @DateTimeFormat和@JsonFormat的区别 一.介绍 二.使用 2.1导包 2.2加注解 三.区别和相同点 3.1区别 3.2 相同点 一.介绍 @DateTimeFormat和@J ...

  2. @DateTimeFormat和@JsonFormat的区别

    一.介绍 @DateTimeFormat和@JsonFormat都是处理时间格式化问题的,把其他类型转换成自己需要的时间类型. 二.使用 2.1导包 @DateTimeFormat和@JsonForm ...

  3. datetimeformat和jsonformat的区别

    datetimeformat:用于格式化参数,可将date的字符串转化为date对象,即前端向后端发送一个约定好的时间字符串 "yyyy-MM-dd hh:mm:ss" 既然是格式 ...

  4. @DateTimeFormat与@JsonFormat不完全解析

    目录 前言 测试代码 @DateTimeFormat 不加任何注解的情况 普通请求 JSON请求 @JsonFormat 普通请求 JSON请求 其他方式(@InitBinder) 结论 源码地址 前 ...

  5. @DateTimeFormat和@JsonFormat介绍

    文章目录 1.@DateTimeFormat注解 1.1@DateTimeFormat注解简介 1.2@DateTimeFormat注解的功能 1.3@DateTimeFormat注解的注意点 1.4 ...

  6. 时间转换@DateTimeFormat和@JsonFormat

    一:@DateTimeFormat是Spring-context包下的注解. 作用:将前端传过来的String类型转为Date类型. (5条消息) 前台传递一个时间字符传,后台怎么用Date类型接收? ...

  7. 关于@DateTimeFormat 和 @JsonFormat 注解

    两个参数都是针对日期格式化做处理 1.入参格式化@DateTimeFormat 传入参数是 String 类型,接收的参数Date 类型,类型无法转换. 使用 Spring 的 @DateTimeFo ...

  8. Date入参和出参格式_@DateTimeFormat 和 @JsonFormat 注解

    1. 准备 定义一个pojo,它有一个 java.util.Date 类型的属性 date. import java.util.Date;           public class DateVo ...

  9. @JsonFormat @DataTimeFormat 时间格式

    省流:用@JsonFormat即可 一.时间格式 字符串转Date 入参出参dto里,有时候会看到@DateTimeFormat或@JsonFormat,代码如下. public class XXXd ...

最新文章

  1. python从控制台读取数据
  2. oracle split去逗号,行列转换 转载
  3. php文本域输出_PHP转换文本框内容为HTML格式的方法
  4. .WM_CTLCOLOR和OnCtlColor消息的用法
  5. 服务器内提取文件,linux命令如何提取文件夹内特定文件路径
  6. 没有bug队——加贝——Python 39,40
  7. 基础数据结构——是否同一棵二叉搜索树
  8. thymeleaf中的内联[ [ ] ]
  9. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展
  10. 实现两边定宽,中间自适应布局(三栏布局)的七种方法
  11. 估计理论(6):如何确定BLUE?
  12. MySQL创建商品入库和出库后库存更新的触发器
  13. 编程运维的一些小Tips
  14. 一文带你了解对游戏外挂的逆向分析的详细步骤。
  15. MIUI——添加学校邮箱到电子邮件解决方案
  16. 全球霸榜的Dell EMC VxRail,靠什么赢得超融合客户认可?
  17. 小米手机ADB删除系统应用去广告
  18. 0基础学RS(十一)VLAN知识点,VLAN的类型,VLAN中继(trunk),本征VLAN
  19. 无线路由器TL-WR703刷Linux操作系统DD-WRT小记(by quqi99)
  20. 小米2016AP2594计算机参数,小米6完整配置参数信息一览:6GB内存 双摄骁龙835

热门文章

  1. android手机 usb hub,绿联PD HUB,让手机秒变台式机电脑般体验的利器
  2. MySQL 存储引擎(InnoDB、MyISAM、MEMORY)
  3. 8Manage:如何变革性的加强企业采购管理? 1
  4. Git切换分支,未提交代码问题
  5. xshell绝佳配色方案
  6. Python 网络爬虫与数据采集(二)
  7. 树状数组-Java代码纯享版
  8. STC15数控直流稳压电源设计
  9. 电容三点式振荡电路-2
  10. 如何成为一个有趣的人?丛非从