@JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date createTime;
在我們使用Mybatis開發時,針對數據庫Datetime
日期類型或者Timestamp
日期類型時,在Mapper映射為Domain
實體並通過@ResponseBody
轉為json
格式的數據返回時,我們會發現,日期類型數據往往不是我們想要的格式,我們需要對其統一做格式化處理。
一、問題闡述
首先,大家看下問題產生的情形:
1)數據庫日期字段類型,以創建時間為例:
- create_time datetime NOT NULL
2)實體中對應的Java字段類型
- private Date createTime;
3)Mapper.xml中的映射配置
- <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
接着,我們請求后返回的json數據,它的日志格式如下:
- "createTime": "2021-09-07T03:21:28.000+00:00"
而數據庫的時間為2021-09-07 11:21:28
,發現不僅格式不是我們想要的,而且時間還差了8小時,也就是時區也存在問題。
二、解決方案
解決該問題有兩個辦法:
方法1、統一配置實現格式化
1) 我這里是SpringBoot項目,首先最簡單粗暴的方式就是直接統一配置進行格式化,依賴jackson包,另外我們需要在application.yml
新增如下配置:

spring: jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8
如果是application.properties
格式文件則配置如下:
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8
親測經過該配置之后,確實返回結果都實現了統一,而且時區問題也解決了。
方法2、注解配置(借助jackson注解)
我們也可以在實體類的時間字段上使用注解來針對性的格式化日期(依賴jackson包)類似如下:
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private Date createTime;
這樣相對配置會多一些,但可以滿足不同情形下對不同日期格式的定制化需求。
據說第一種統一配置的方法,針對請求日期格式的入參也必須滿足此格式。
方法3、注解配置(借助fastjson注解)
此方法依賴fastjson包:
@JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date createTime;
總結
該兩種方法可以合用,而且第二種優先級較高,也就說兩種你都配置,會以@JsonFormat
為准,如果沒加@JsonFormat
注解則默認會使用統一配置的格式,這樣靈活性更好。