省流:用@JsonFormat即可

一、时间格式

  1. 字符串转Date

入参出参dto里,有时候会看到@DateTimeFormat或@JsonFormat,代码如下。

public class XXXdto{@DateTimeFormat(pattern = "yyyy-MM-dd")private Date startDate;
}public class XXXdto{@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date startDate;
}

加@DateTimeFormat注解的目的:将字符串的时间转换成Date类型。此注解只能用于form表单请求和get请求。

加@JsonFormat注解的目的:将字符串的时间转换成Date类型。此注解只能用于json请求。在Controller层入参处需要用@RequestBody

补充:@DataTimeFormat用于前端传后端,@JsonFormat用于后端传前端,这种说法是错误的。@JsonFormat前传后、后传前都可以用。

使用方法:加在时间类型的变量上。

  1. 时间格式不匹配

这是为了入参可以是日期时间格式(年月日时分秒)的值。如 {"startDate":"2022-01-01 01:02:02"}。

如果没有加注解@DateTimeFormat,会报错:

Invalid JSON input:
Cannot deserialize value of type `java.util.Date` from String "2023-02-01 01:02:03": not a valid representation (error: Failed to parse Date value '2023-02-01 01:02:03': Cannot parse date "2023-02-01 01:02:03": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ', parsing fails (leniency? null));
nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException:
Cannot deserialize value of type `java.util.Date` from String "2023-02-01 01:02:03": not a valid representation (error: Failed to parse Date value '2023-02-01 01:02:03': Cannot parse date "2023-02-01 01:02:03": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ', parsing fails (leniency? null))

根据报错信息,while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ',判断传入的值日期格式有问题。

  1. 正确的时间格式

正确时间格式:2023-02-01T00:00:00.000+0800,即前端传参: {"startDate":"2023-02-01T00:00:00.000+0800"}。

由于前端通常也是直接使用时间组件生成的值,时间组件生成的就是正确的时间格式,所以通常后端不需要加@DateTimeFormat。

但如果前端传的是自定义的值,例如:2023-01-01 01:01:01,即年月日时分秒,由于这个值不是正确的时间格式,这时候,后端没有加注解就会报错。

在没有注解的年代,会用SimpleDateFormat做转换。代码如下

public class XXXdto{private String startDate;public Date getStartDate(){return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(startDate);}
}

但@DataTimeFormat不如@JsonFormat好用。另,如果值是纯日期,例如2022-01-01,也不需要用注解。

二、注解

  1. @JsonFormat

com.fasterxml.jackson.annotation.JsonFormat;

public class XXXdto{@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")private Date startDate;
}

@JsonFormat 默认的时区是 Greenwich Time, 格林威治时间,而我们是在东八区。查到的时间可能会比数据库中的时间少八个小时。所以需要加上timezone="GMT+8"

  1. @DataTimeFormat

org.springframework.format.annotation.DateTimeFormat

public class XXXdto{@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date startDate;
}
  1. @JsonFormat 和 @DateTimeFormat 区别

@JsonFormat

@DateTimeFormat

转换前端传入后端的时间格式的值

约束后端响应前端的时间类型的值

×

数据类型(前端提交到后端)

必须json

用@RequestBody

必须form表单

不用@RequestBody

时区

×

响应给前端的时间会比实际时间晚8个小时

三、补充:

1.前端传值给后端,后端接收到的都是字符串。

2.前端传日期格式的值,如果形如yyyy-MM-dd,即{"startDate":"2023-01-02"},不需要用@DataTimeFormat和@JsonFormat,框架会帮你转。

四、自测

各种情况测试对比

无@RequestBody

无@DateTimeFormat

无@RequestBody

有@DateTimeFormat

form表单提交

报错,见报错1。因为传的值是字符串,而后端的变量是Date类型

时间格式匹配对,则不会报错。例如:2022-01-01

匹配错则报错,见报错2。例如:2022-01-01 10:01:01

因为注解中模板是"yyyy-MM-dd",而传的值是年月日时分秒

json提交

不报错。入参变量startDate的值是null,说明没有赋值操作。意味着没有@RequestBody,json提交后端接收不到值;form表单提交,后端才能接收到值

不报错。同前面

报错1
Field error in object 'safescoreHomePageQueryParam' on field 'startTime': rejected value [2023-02-01 01:01:01];Failed to convert property value of type 'java.lang.String' to required type 'java.util.Date' for property 'endTime';nested exception is java.lang.IllegalArgumentException
报错2
nested exception is java.lang.IllegalArgumentException: Invalid format: "2023-02-01 01:01:01" is malformed at " 01:01:01"

使用@RequestBody,form表单提交会报错如下

Content type 'multipart/form-data;boundary=--------------------------590532731747110494187237;charset=UTF-8' not supported

使用@RequestBody,JSON提交,使用@JsonFormat,入参如果写20220101报错如下。

入参2022-01-01 10:01:01不会报错。时分秒写错不会报错

Invalid JSON input: Cannot deserialize value of type `java.util.Date` from String "20220101": expected format "yyyy-MM-dd"; nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String "20220101": expected format "yyyy-MM-dd"at [Source: (PushbackInputStream); line: 1, column: 14] (through reference chain: com.xxx.dto.xxx.xxxDTO["startTime"])

使用@RequestBody,JSON提交,不使用@JsonFormat,入参2022-01-01 10:01:01报错如下。入参2022-01-01不会报错。

Invalid JSON input: Cannot deserialize value of type `java.util.Date` from String "2022-01-01 10:01:01": not a valid representation (error: Failed to parse Date value '2022-01-01 10:01:01': Cannot parse date "2022-01-01 10:01:01": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ', parsing fails (leniency? null)); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.util.Date` from String "2022-01-01 10:01:01": not a valid representation (error: Failed to parse Date value '2022-01-01 10:01:01': Cannot parse date "2022-01-01 10:01:01": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ', parsing fails (leniency? null))at [Source: (PushbackInputStream); line: 1, column: 14] (through reference chain: com.xxx.dto.xxx.xxxDTO["startTime"])

参考

不要在听大坑们@DateTimeFormat 和 @JsonFormat只是前后端传参的区别了_*阿莫西林*的博客-CSDN博客

SpringBoot中时间格式化的5种方法!

@JsonFormat @DataTimeFormat 时间格式相关推荐

  1. Jackson(二):@JsonFormat时间格式及时区问题

    一.说明 今天遇到一个查了很久的问题,具体表现为前端传过来的时间参数的时区是+0800,我用Jackson反序列化成对象时,时间解析出来还是正确的,但是我再将对象序列化为Json数据时时区又变成了+0 ...

  2. mysql 获取指定时区时间格式,JsonFormat指定时区

    服务器的时区是: Mysql的时区是: 可以看到系统时区是东八区,而Mysql用了系统时区,在Java使用 Date now = new Date()数据类型,并存入数据库中类型为datetime的对 ...

  3. SpringBoot升级到2.0后默认时间格式变化_springboot接收date类型参数

    springboot1.x时,请求返回默认将Date类型转换成时间戳: createTime: 1544693261000 然而在升级到springboot2.0后,默认返回的时间格式变成了UTC字符 ...

  4. mysql date 24小时制_SpringBoor连接mysql数据库取数据库中时间格式是12小时制的时间,如何显示成24小时制...

    设置spring配置文件: 1.spring.datasource.url=jdbc:mysql://10.35.105.25:3306/database?characterEncoding=utf- ...

  5. vue时间格式2021-11-21T12:30:00.000+00:00转换yyyy-MM-dd HH:mm:ss

    vue时间格式2021-11-21T12:30:00.000+00:00转换yyyy-MM-dd HH:mm:ss 1.html部分 <el-table-column prop="up ...

  6. vue中时间格式2021-11-21T12:30:00.000+00:00转换yyyy-MM-dd HH:mm:ss

    vue时间格式2021-11-21T12:30:00.000+00:00转换yyyy-MM-dd HH:mm:ss 1.方式一 <el-table-column prop="updat ...

  7. 解决时间输出格式带 T 带 000+00:00 输出时间多了个T 返回时间格式带T

    困扰了N多天的输出时间格式问题,人都麻了 在 SpringBoot 项目中使用了 MyBatis-Plus多条件分页连表查询后出现了这个问题,查询出来的时间被加上了一个T和 000+00:00 很明显 ...

  8. @JsonFormat将时间字符串2021-02-25T15:32:54+08:00解析成date

    @JsonFormat将时间字符串2021-02-25T15:32:54+08:00解析成date 由于对接硬件,硬件返回的json字符串中,其中有时间字段的字符串为2021-02-25T15:32: ...

  9. Java时间格式保存出错处理:java.util.Date,typeMismatch

    Field error in object 'role' on field 'createDatetime': rejected value [2021-02-19 11:38:38]; codes ...

最新文章

  1. ENC28j60以太网芯片驱动程序简介
  2. 程序员之网络安全系列(三):数据加密之对称加密算法
  3. [转]Cookie/Session机制详解
  4. hdu 6127---Hard challenge(思维)
  5. Cannot resolve symbol ‘NotBlank‘ Cannot resolve symbol ‘Email‘ Cannot resolve symbol ‘NotEmpty‘
  6. 信息竞赛进阶指南--单调栈(模板)
  7. oracle表字段获取,获取oracle表结构的字段信息
  8. 没想到,我们的分布式缓存竟这样把注册中心搞垮!
  9. db2查询表结构语句_常用的sql语句集合(适合数据库初级人员)
  10. windows xp下Apache2.2.11整合Tomcat6.0.20(集群模式无集群模式)
  11. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_6 mybatis中的事务原理和自动提交设置
  12. myeclipse与mysql连接_myeclipse 与 mysql 的连接
  13. 开心消消乐简单的逆向破解过程
  14. 深度学习在视频动作识别中的应用
  15. 分枝定界法,例题梳理
  16. 扎实干货!PP-Tracking:百度提出实时目标跟踪系统(附源码教程)
  17. 红蜻蜓抓图精灵抓视频播放器画面结果一片漆黑解决教程
  18. 生活大爆炸版石头剪刀布-简单模拟
  19. 关于不锈钢管TIG+MAG
  20. 树莓派Pico开发板与大功率MOSFET/IGBT器件驱动控制24V直流电机技术实践

热门文章

  1. 炸金花游戏(5)--动态收敛预期胜率的一种思路
  2. 苹果设置网易邮箱收件服务器,苹果手机iphone怎么设置网易邮箱 iphone设置网易邮箱教程【步骤】...
  3. nas系统存储服务器,我的瞎折腾NAS之系统选择篇
  4. 深圳大澳湾度假团建攻略
  5. 解读符合新时代主流的创客教育模式
  6. 如何修改3D模型的原子属性
  7. Spring 的 init-method 和 destory-method
  8. 3D点云处理:点云聚类--FEC: Fast Euclidean Clustering for Point Cloud Segmentation
  9. MySQL数据库备份练习
  10. 易飞ERP--电子表单派班中心异常Illegal EasyFlow Account !-resak001