接收Date为什么多出了HH:mm:ss?

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;
}

问题反思:

问题解决后不禁一声叹息,问了自己几个问题。

  1. 我为什么要加上@DateTimeFormat(pattern = "yyyy-MM-dd"),它的作用到底是什么?
  2. import java.util.Date; 和 import java.sql.Date;到底有什么不一样?
  3. 数据类型和数据之间的关系我真的理解了吗?

我为什么要加上@DateTimeFormat(pattern = "yyyy-MM-dd"),它的作用到底是什么?

答:

  1. 为什么我要加上这个注解?

遇到问题后,反手就是CV Google. 看到有答案贴了 @DateTimeFormat(pattern = "yyyy-MM-dd"),就觉得这个注解可以让参数按照 yyyy-MM-dd 格式化能去掉08:00:00.0。

  1. 这个注解的作用到底是什么?

上面是spring文档。我的理解 @DateTimeFormat 只是一个约束,参数必须是 pattern 指定的格式。

import java.util.Date; 和 import java.sql.Date;到底有什么不一样?

答:

  1. 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:

  1. 数据类型和数据之间的关系我真的理解了吗?

答:如果真的理解数据类型和数据之间的关系。思考这个问题时的角度会不一样。可能会先思考Date数据类型的默认精度为年月日时分秒,参数只传入年月日,所以自动补齐了时分秒。这个时候要解决问题,就需要修改数据类型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值