本人在项目中发现,Debug得到的日期返回值和最后输出swagger的日期值不一致,万思不得其解,最后发现我用的是java.sql.Date,改为java.util.Date就OK了.
日期出错
先还原一下出错场景:
import java.sql.Date;
@ApiModel(value = "记录出参VO")
@Data
public class SurgeryNursingVO {
@ApiModelProperty(value = "项目时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date dates;
}
数据库数据是 :2020-12-15 18:02:33
Debug返回的数据也是次数据。
而swagger 输出却是:2020-12-14 16:00:00
!!!!!!这就奇怪了。
我就试一下,代码改了:
import java.util.Date;
最后输出:2020-12-15 18:02:33
和数据库一样了!!!!!
那我们来看一下这两个Date的区别
java.util.Date和java.sql.Date的区别
java.util.Date是在除了SQL语句的情况下面使用的。
java.sql.Date是针对SQL语句使用的,它只包含日期而没有时间部分
它们都有getTime方法返回毫秒数,自然就可以直接构建。
java.util.Date 是 java.sql.Date 的父类,前者是常用的表示时间的类,我们通常格式化或者得到当前时间都是用他,后者之后在读写数据库的时候用他,因为PreparedStament的setDate()的第2参数和ResultSet的getDate()方法的第2个参数都是java.sql.Date。
详细查看java.sql.Date类:
一个包装了毫秒值的瘦包装器 (thin wrapper),它允许 JDBC 将毫秒值标识为 SQL DATE 值。毫秒值表示自 1970 年 1 月 1 日 00:00:00 GMT 以来经过的毫秒数。
为了与 SQL DATE 的定义一致,由 java.sql.Date 实例包装的毫秒值必须通过将小时、分钟、秒和毫秒设置为与该实例相关的特定时区中的零来“规范化”。
“规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。因此,如果数据库中存在的非规范化部分的信息将会被截取
也就是说,如果你是 2017-09-17 15:15:25 这样的时间点存取数据,那么存在数据库中的值就是:2017-09-17 00:00:00
swagger输出与数据库不一致
@ApiModelProperty(value = "生日日期")
@JsonFormat(pattern="yyyy-MM-dd")
private Date birthDate;
此时就不是swagger的原因了,而是@JsonFormat的问题了
改为
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
就OK了,前后时间就一致了。
java.util.Date和java.sql.Date的区别和相互转化
java.sql.Date和java.util.Date区别及使用
Swagger – 解决日期不正确(示例代码)