@JsonFormat @DataTimeFormat 时间格式
省流:用@JsonFormat即可
一、时间格式
字符串转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前传后、后传前都可以用。
使用方法:加在时间类型的变量上。
时间格式不匹配
这是为了入参可以是日期时间格式(年月日时分秒)的值。如 {"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',判断传入的值日期格式有问题。
正确的时间格式
正确时间格式: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,也不需要用注解。
二、注解
@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"
@DataTimeFormat
org.springframework.format.annotation.DateTimeFormat
public class XXXdto{@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")private Date startDate;
}
@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 时间格式相关推荐
- Jackson(二):@JsonFormat时间格式及时区问题
一.说明 今天遇到一个查了很久的问题,具体表现为前端传过来的时间参数的时区是+0800,我用Jackson反序列化成对象时,时间解析出来还是正确的,但是我再将对象序列化为Json数据时时区又变成了+0 ...
- mysql 获取指定时区时间格式,JsonFormat指定时区
服务器的时区是: Mysql的时区是: 可以看到系统时区是东八区,而Mysql用了系统时区,在Java使用 Date now = new Date()数据类型,并存入数据库中类型为datetime的对 ...
- SpringBoot升级到2.0后默认时间格式变化_springboot接收date类型参数
springboot1.x时,请求返回默认将Date类型转换成时间戳: createTime: 1544693261000 然而在升级到springboot2.0后,默认返回的时间格式变成了UTC字符 ...
- mysql date 24小时制_SpringBoor连接mysql数据库取数据库中时间格式是12小时制的时间,如何显示成24小时制...
设置spring配置文件: 1.spring.datasource.url=jdbc:mysql://10.35.105.25:3306/database?characterEncoding=utf- ...
- 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 ...
- 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 ...
- 解决时间输出格式带 T 带 000+00:00 输出时间多了个T 返回时间格式带T
困扰了N多天的输出时间格式问题,人都麻了 在 SpringBoot 项目中使用了 MyBatis-Plus多条件分页连表查询后出现了这个问题,查询出来的时间被加上了一个T和 000+00:00 很明显 ...
- @JsonFormat将时间字符串2021-02-25T15:32:54+08:00解析成date
@JsonFormat将时间字符串2021-02-25T15:32:54+08:00解析成date 由于对接硬件,硬件返回的json字符串中,其中有时间字段的字符串为2021-02-25T15:32: ...
- Java时间格式保存出错处理:java.util.Date,typeMismatch
Field error in object 'role' on field 'createDatetime': rejected value [2021-02-19 11:38:38]; codes ...
最新文章
- ENC28j60以太网芯片驱动程序简介
- 程序员之网络安全系列(三):数据加密之对称加密算法
- [转]Cookie/Session机制详解
- hdu 6127---Hard challenge(思维)
- Cannot resolve symbol ‘NotBlank‘ Cannot resolve symbol ‘Email‘ Cannot resolve symbol ‘NotEmpty‘
- 信息竞赛进阶指南--单调栈(模板)
- oracle表字段获取,获取oracle表结构的字段信息
- 没想到,我们的分布式缓存竟这样把注册中心搞垮!
- db2查询表结构语句_常用的sql语句集合(适合数据库初级人员)
- windows xp下Apache2.2.11整合Tomcat6.0.20(集群模式无集群模式)
- 阶段3 1.Mybatis_07.Mybatis的连接池及事务_6 mybatis中的事务原理和自动提交设置
- myeclipse与mysql连接_myeclipse 与 mysql 的连接
- 开心消消乐简单的逆向破解过程
- 深度学习在视频动作识别中的应用
- 分枝定界法,例题梳理
- 扎实干货!PP-Tracking:百度提出实时目标跟踪系统(附源码教程)
- 红蜻蜓抓图精灵抓视频播放器画面结果一片漆黑解决教程
- 生活大爆炸版石头剪刀布-简单模拟
- 关于不锈钢管TIG+MAG
- 树莓派Pico开发板与大功率MOSFET/IGBT器件驱动控制24V直流电机技术实践
热门文章
- 炸金花游戏(5)--动态收敛预期胜率的一种思路
- 苹果设置网易邮箱收件服务器,苹果手机iphone怎么设置网易邮箱 iphone设置网易邮箱教程【步骤】...
- nas系统存储服务器,我的瞎折腾NAS之系统选择篇
- 深圳大澳湾度假团建攻略
- 解读符合新时代主流的创客教育模式
- 如何修改3D模型的原子属性
- Spring 的 init-method 和 destory-method
- 3D点云处理:点云聚类--FEC: Fast Euclidean Clustering for Point Cloud Segmentation
- MySQL数据库备份练习
- 易飞ERP--电子表单派班中心异常Illegal EasyFlow Account !-resak001