Cannot deserialize value of type `java.util.Date` from String

2年前 (2022) 程序员胖胖胖虎阿
444 0 0

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类型的时间戳(毫秒时间戳)

解决方法

  • 所以在接收到数据的时候,需要通过jackson把数据转化。jackson转化默认的时间格式 'yyyy-MM-dd’T’HH:mm:ss.SSS’,所以就会出现异常,所以要设置时区的格式为"yyyy-MM-dd HH:mm:ss"。
  • 采用long时间戳,如:1537191968000

@DateTimeFormat

  • 只能格式化前端传入的日期时间类型的参数,不能格式化后端传给前端的日期时间类字段

  • 仅支持前端使用表单键值对的请求提交方式,不支持Json格式的请求提交方式
    用法:
    请求URL : http://localhost:9999/put?date=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类型的参数给后端

相关文章

暂无评论

暂无评论...