json传入标准格式的 yyyy-MM-dd ,想让其展示成 2022-09-29,而程序好像和我作对,总是输出 2022-09-29 08:00:00.0。
问题描述:
请求体:
{ "transId": "20", "origin": "adipisicing Lorem eu", "destination": "culpa exercitation sint dolor", "departureDate": "2022-09-29", "num": 11 }
DTO:
@Data public class TicketRequest extends BaseRequest{ private String transId; private String ticketId; private String origin; private String destination; @DateTimeFormat(pattern = "yyyy-MM-dd") private Date departureDate; private int num; }
Controller:
@PostMapping("/query") public BaseResponse queryTicket(@RequestBody TicketRequest request){ return ticketServer.queryTicket(request); }
请求体 -> DTO -> Controller, 使用了@RequestBody 接收post 请求体 body 中的 json 数据。 并且使用了@DateTimeFormat(pattern = "yyyy-MM-dd") 注解格式化请求参数。
按我的理解此时反序列化后的 departureDate 参数的格式应该是 yyyy-MM-dd 。可实际上却不是这样,实际结果如下。
反序列化后的请求参数:
问题解决:
DTO层,import java.util.Date; -> import java.sql.Date;
//import java.util.Date; import java.sql.Date; @Data public class TicketRequest extends BaseRequest{ private String transId; private String ticketId; private String origin; private String destination; @DateTimeFormat(pattern = "yyyy-MM-dd") private Date departureDate; private int num; }
替换掉 java.util.Date 后,当前端传入 yyyy-MM-dd 格式的数据时,此时不会再 多一个 08:00:00.0 了。
甚至这时候我可以把 @DateTimeFormat(pattern = "yyyy-MM-dd") 去掉。
//import java.util.Date; import java.sql.Date; @Data public class TicketRequest extends BaseRequest{ private String transId; private String ticketId; private String origin; private String destination; private Date departureDate; private int num; }
问题反思:
问题解决后不禁一声叹息,问了自己几个问题。
- 我为什么要加上@DateTimeFormat(pattern = "yyyy-MM-dd"),它的作用到底是什么?
- import java.util.Date; 和 import java.sql.Date;到底有什么不一样?
- 数据类型和数据之间的关系我真的理解了吗?
我为什么要加上@DateTimeFormat(pattern = "yyyy-MM-dd"),它的作用到底是什么?
答:
- 为什么我要加上这个注解?
遇到问题后,反手就是CV Google. 看到有答案贴了 @DateTimeFormat(pattern = "yyyy-MM-dd"),就觉得这个注解可以让参数按照 yyyy-MM-dd 格式化,能去掉08:00:00.0。
- 这个注解的作用到底是什么
上面是spring文档。我的理解 @DateTimeFormat 只是一个约束,参数必须是 pattern 指定的格式。
import java.util.Date; 和 import java.sql.Date;到底有什么不一样?
答:
- java.sql.Date 是 java.util.Date 的子类。
2. java.sql.Date 和 java.util.Date 的时间精度不一样。
java.sql.Date 的时间精度是 年月日,java.util.Date 的时间精度是年月日时分秒。下面我贴一下部分代码java.sql.Date,java.util.Date 代码太多就不贴了。
java.sql.Date:
- 数据类型和数据之间的关系我真的理解了吗?
答:如果真的理解数据类型和数据之间的关系。思考这个问题时的角度会不一样。可能会先思考Date数据类型的默认精度为年月日时分秒,参数只传入年月日,所以自动补齐了时分秒。这个时候要解决问题,就需要修改数据类型。
标签:java,String,mm,dd,private,yyyy,ss,HH,Date From: https://www.cnblogs.com/alan98/p/16742438.html