com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type java.util.Date
from String “2022-06-21 18:00:01”: not a valid representation (error: Failed to parse Date value ‘2022-06-21 18:00:01’: Cannot parse date “2022-06-21 18:00:01”: while it seems to fit format ‘yyyy-MM-dd’T’HH:mm:ss.SSSZ’, parsing fails (leniency null))
翻译:不能反序列化java.util类型的值从字符串"2022-06-21 18:00:01":不是一个有效的表示(错误:解析Date值’2022-06-21 18:00:01’失败:你能解析日期"2022-06-21 18:00:01":而它似乎是和格式’yyyy-MM-dd’T’HH:mm:ss.SSSZ’,解析失败(宽大 为null))
原因:因为传入的参数是 String 类型的,而用来接收参数的 DateVo 的 date 属性是 java.util.Date 类型的,类型无法转换。
springboot默认采用jackson,而jackson只能识别以下几种日期格式
"yyyy-MM-dd'T'HH:mm:ss.SSSZ";
"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
"yyyy-MM-dd";
"EEE, dd MMM yyyy HH:mm:ss zzz";
long类型的时间戳(毫秒时间戳)
解决方法
@DateTimeFormat
只能格式化前端传入的日期时间类型的参数,不能格式化后端传给前端的日期时间类字段
仅支持前端使用表单键值对的请求提交方式,不支持Json格式的请求提交方式
用法:
请求URL : http://localhost:9999/putdate=2020-03-07 13:13:13
@PostMapping(“put”)
public User put(@DateTimeFormat(pattern = “yyyy-MM-dd HH”) @RequestParam Date date){
System.out.println(date); // Sat Mar 07 13:00:00 CST 2020 // 可以看到分和秒都被忽略了。
}
错误用法
class User{
@DateTimeFormat(pattern = "yyyy-MM-dd") // 这样没有作用
private Date date;
/*getter setter*/
}
@JsonFormat
用于解决反序列化传值的情况
timezone解释:
意思是用于反序列化时,指定这个默认时区,也就是传进来的字符串的时区。默认是UTC就是:0时区。(因为服务器也有一个时区,所以要根据传进值的时区,进行转换,后续详细演示)
能格式化前端传入的日期时间类型的参数,也能格式化后端传给前端的日期时间类字段
仅支持Json格式的请求提交方式,不仅支持前端使用表单键值对的请求提交方式
接受字符串转化为Date的实体
class User{
@JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”) // 这里未指明 传入字符串的时区
private Date date;
}
前台json格式请求
{
"date":"2020-03-07 12:12:12"
}
后台接受
@PostMapping("put")
public User put(@RequestBody User user){
System.out.println(user.getDate()); // Sat Mar 07 20:12:12 CST 2020
}
传入的是12点,转成对象为20点。为什么?
默认是传入的对象时区默认为UTC时区,现在服务器所在的时区是东8区,晚8小时,需要进行转换时区操作,加8。
指定timezone
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date date;
传进来值,时区一样,无须转化时区。
参考博客
@DateTimeFormat 和 @JsonFormat 的详细研究,以及timezone=“GMT+8“的研究,时区问题(1)
Java前端如何发送date类型的参数给后端