Java前端实现发送date类型的参数给后端
目录
- @DateTimeFormat
- 第一次:Get方式传参-成功
- 第二次:Post方式传参-失败
- 第三次:post传参-成功
- 第四次:post传参-成功
- @jsonFormat
- 总结
@DateTimeFormat
第一次:Get方式传参-成功
这个时候是用的get请求方式,get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应
/** * http://localhost:8080/intoParam?date=2019-01-18 11:11:11 */ 编程客栈 @RequestMapping(value = "/intoParam",method = RequestMetKkjXUhod.GET) @ResponseBody public void intoParam(@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date date){ System.out.println(date);//Fri Jan 18 08:00:00 CST 2019 }
第二次:Post方式传参-失败
/** * http://localhost:8080/intoParam * 请求体 * { * "date":"2019-01-18 11:11:11" * } */ @RequestMapping(value = "/intoParam",method = RequestMethod.POST) @ResponseBody public void intoParam2(@RequestBody DateVKkjXUo dateVo){ System.out.println(dateVo.getDate());//Fri Jan 18 08:00:00 CST 2019 } @Data @AllArgsConstructor @NoArgsConstructor public class DateVo { @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") private Date date; }
错误信息:
{
"timestamp": "2021-10-19T07:05:22.407+0000", "status": 400, "error": "Bad Request", "message": "JSON parse error: Cannot deserialize value of type `Java.util.Date` from String \"2019-01-18 11:11:11\": not a valid representation (error: Failed to parse Date value '2019-01-18 11:11:11': Cannot parse date \"2019-01-18 11:11:11\": 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 \"2019-01-18 11:11:11\": not a valid representation (error: Failed to parse Date value '2019-01-18 11:11:11': Cannot parse date \"2019-01-18 11:11:11\": while it seems to fit format 'yyyy-MM-dd'T'HH:mm:ss.SSSZ', parsing fails (leniency? null))\n at [Source: (PushbackInputStream); line: 2, column: 12] (through reference chain: com.mye.hl20springbootdataparam.vo.DateVo[\"date\"])", "path": "/intoParam"}
第三次:post传参-成功
/** * http://localhost:8080/intoParam * 請编程求體是: * { * "date":"2019-01-18" * } */ @RequestMapping(value = "/intoParam",method = RequestMethod.POST) @ResponseBody public void intoParam2(@RequestBody DateVo dateVo){ System.out.println(dateVo.getDate());//Fri Jan 18 08:00:00 CST 2019 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String format = sdf.format(dateVo.getDate()); System.out.println(format);//2019-01-18 } @Data @AllArgsConstructor @NoArgsConstructor public class DateVo { @DateTimeFormat(pattern="yyyy-MM-dd") private Date 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类型的时间戳(毫秒时间戳)
解决方法:
- 采用long时间戳,如:1537191968000
- 在传参的对象上加上@JsonFormat注解并且指定时区
@JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd HH:mm:ss")
第四次:post传参-成功
/** * http://localhost:8080/intoParam * 請求體是: * { * "date":"2019-01-18 11:11:11" * } */ @RequestMapping(value = "/intoParam",method = RequestMethod.POST) @ResponseBody public void intoParam2(@RequestBody DateVo dateVo){ System.out.println(dateVo.getDate());//Fri Jan 18 11:11:11 CST 2019 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); String format = sdf.format(dateVo.getDate()); System.out.println(format);//2019-01-18 11:11:11 } @Data @AllArgsConstructor @NoArgsConstructor public class DateVo { @DateTimeFormat(pattern="yyyy-MM-dd") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date date; }
@jsonFormat
@JsonFormat(pattern=“yyyy-MM-dd”,timezone = “GMT+8”)
pattern
:是你需要转换的时间日期的格式timezone
:是时间设置为东八区,避免时间在转换中有误差@JsonFormat
注解可以在属性的上方,同样可以在属性对应的get方法上,两种方式没有区别
/** *http://localhost:8080/outParam */ @RequestMapping(value = "/outParam",method = RequestMethod.GET) @ResponseBody public DateVo intoParam2(){ return new DateVo(new Date()); } @Data @AllArgsConstructor @NoArgsjsConstructor public class DateVo { // @DateTimeFormat(pattern="yyyy-MM-dd") @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date date; }
展示结果:
{ "date": "2021-10-19 15:44:51" }
总结
前端Content-Type 为application/json
的请求时,我们使用@JsonFormat
来进行转化,如果为表单,则应该使用@DateTimeFormat
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。
精彩评论