項目中常常會用到與日期相關的註解,這裏簡單介紹下吧java
第一種:——》實體類會封裝成日期「yyyy-MM-dd」的 Date類型。
第二種:——》實體類會封裝成時間「hh-MM-ss」的 Date類型。
第三種:——》實體類會封裝成完整的時間「yyyy-MM-dd hh:MM:ss」的 Date類型。mysql
若是字段爲date類型,則很是匹配,查詢出來到前臺的處理直接就是2019-01-24
web
若是數據庫字段爲datetime類型,則,數據庫時分秒會變成00:00:00,可是到了前臺只顯示年月日spring
insert插入報錯:Incorrect datetime value: ‘17:31:28’ for column ‘cdate’ at row 1sql
// { // "id": 1, // "dateT": null, // "dateTTime": null, // "dateTTimesTamp": null, // "dateTimeFormat": null, // "dateTDate": null, // "cdate": "17:31:28", // "udate": 1548322288000 // }
// @Temporal(TemporalType.TIME) @ApiModelProperty(value = "dateTime類型 TemporalType.TIME date類型爲 hh-MM-ss",dataType = "date") private Date dateTTime ;
很是正常的數據處理,返回到前臺就是一個時間戳,到了庫裏面,年月日,時分秒數據庫
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
1. @DateTimeFormat(pattern = "yyyy-MM-dd")//存日期時使用,仍是算了包。存日期我這裏有問題 ,通常也不必整這個 2. private Date startTime;
package com.hlj.entity.db.demo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.experimental.Accessors; import org.hibernate.annotations.UpdateTimestamp; import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.util.Date; /** * 做者 :HealerJean * 日期 :2019/1/24 下午5:10. * 類描述: */ @Entity @Table(name = "demo_entity_date") @Data @Accessors(chain = true) @ApiModel(value = "D04-測試Temporal 日期格式問題") public class D04DateEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @ApiModelProperty(value = "demo01update 主鍵") private Long id; @Temporal(TemporalType.DATE) @ApiModelProperty(value = "dateTime類型 TemporalType.DATE") private Date dateT; // @Temporal(TemporalType.TIME) // insert插入報錯 給 字段爲timestime 插入的時候回提示報錯: Incorrect datetime value: '17:31:28' for column 'cdate' at row 1 // 查詢沒有問題 ,返回到前臺不是時間戳了,直接就變成了以下,因此通常不要使用 // { // "id": 1, // "dateT": null, // "dateTTime": null, // "dateTTimesTamp": null, // "dateTimeFormat": null, // "dateTDate": null, // "cdate": "17:31:28", // "udate": 1548322288000 // } @ApiModelProperty(value = "dateTime類型 TemporalType.TIME",dataType = "date") private Date dateTTime ; @Temporal(TemporalType.TIMESTAMP) @ApiModelProperty(value = "dateTime類型 TemporalType.TIMESTAMP") private Date dateTTimesTamp ; @DateTimeFormat(pattern="yyyy-MM-dd") @ApiModelProperty(value = "dateTime類型 測試DateTimeFormat") private Date dateTimeFormat ; @ApiModelProperty(value = "數據庫中存放的就是 date類型") private Date dateTDate ; @Column(insertable = true,updatable = false) private Date cdate; @UpdateTimestamp private Date udate; } /** * 第一種:@Temporal(TemporalType.DATE)——》實體類會封裝成日期「yyyy-MM-dd」的 Date類型。 第二種:@Temporal(TemporalType.TIME)——》實體類會封裝成時間「hh-MM-ss」的 Date類型。 第三種:@Temporal(TemporalType.TIMESTAMP)——》實體類會封裝成完整的時間「yyyy-MM-dd hh:MM:ss」的 Date類型。 CREATE TABLE `demo_entity_date` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, dateT datetime , dateTTime datetime , dateTTimesTamp datetime , dateTimeFormat datetime, dateTDate date, `cdate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `udate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ); */
package com.hlj.moudle.jpacru.controller; import com.hlj.dao.db.D05DateEntityRepository; import com.hlj.entity.db.demo.D04DateEntity; import com.hlj.moudle.jpacru.service.D05DateService; import io.swagger.annotations.*; import org.springframework.beans.propertyeditors.CustomDateEditor; import org.springframework.stereotype.Controller; import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.InitBinder; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.annotation.Resource; import java.text.SimpleDateFormat; import java.util.Date; /** * 做者 :HealerJean * 日期 :2019/1/24 下午5:04. * 類描述: */ @ApiResponses(value = { @ApiResponse(code = 200, message = "訪問正常"), @ApiResponse(code = 301, message = "邏輯錯誤"), @ApiResponse(code = 500, message = "系統錯誤"), @ApiResponse(code = 401, message = "未認證"), @ApiResponse(code = 403, message = "禁止訪問"), @ApiResponse(code = 404, message = "url錯誤") }) @Api(description = "Date類型的格式化") @Controller @RequestMapping("jpa/date") public class D05DateController { @InitBinder public void dateBinder(WebDataBinder binder){ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); binder.registerCustomEditor(Date.class,new CustomDateEditor(dateFormat,true)); } @Resource private D05DateService dateService ; @Resource private D05DateEntityRepository d05DateEntityRepository; @GetMapping("addD04DateEntity") @ResponseBody public D04DateEntity addD04DateEntity(D04DateEntity d04DateEntity){ return dateService.addD04DateEntity(d04DateEntity) ; } @GetMapping("findById") @ResponseBody @ApiImplicitParams({ @ApiImplicitParam(name = "id",value = "主鍵Id",defaultValue = "1",required = true,dataType = "long",dataTypeClass = Long.class,paramType = "query"), }) public D04DateEntity findById(Long id){ return d05DateEntityRepository.findOne(id) ; } }
@Service @Slf4j public class D05DateServiceImpl implements D05DateService { @Resource private D05DateEntityRepository d05DateEntityRepository; public D04DateEntity addD04DateEntity (D04DateEntity d04DateEntity){ d05DateEntityRepository.save(d04DateEntity); return d04DateEntity ; } }
保存並返回實體的結果以下,沒有看到上面的@Temporal(TemporalType.DATE)
起做用微信
{ "id": 2, "dateT": "1548322288000", "dateTTime": 1548322288000, "dateTTimesTamp": 1548322288000, "dateTimeFormat": 1548322288000, "dateTDate": 1548259200000, "cdate": 1548322288000, "udate": 1548323059000 }
這才提現出來,說明上面的@Temporal 只針對從數據庫中查詢處理的格式轉化有效,因此,仍是建議不使用它了。app
{ "id": 2, "dateT": "2019-01-24", "dateTTime": 1548322288000, "dateTTimesTamp": 1548322288000, "dateTimeFormat": 1548322288000, "dateTDate": 1548259200000, "cdate": 1548322288000, "udate": 1548323059000 }
@JsonFormat
完美控制器@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @Column(insertable = true,updatable = false) private Date cdate; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") @UpdateTimestamp private Date udate;
保存並返回的實體以下svg
{ "id": 3, "dateT": 1548322288000, "dateTTime": 1548322288000, "dateTTimesTamp": 1548322288000, "dateTimeFormat": 1548322288000, "dateTDate": 1548322288000, "cdate": "2019-01-24 17:31:28", "udate": "2019-01-24 18:12:28" }
根據id查詢返回的結果以下
{ "id": 3, "dateT": "2019-01-24", "dateTTime": 1548322288000, "dateTTimesTamp": 1548322288000, "dateTimeFormat": 1548322288000, "dateTDate": 1548259200000, "cdate": "2019-01-24 17:31:28", "udate": "2019-01-24 18:04:46" }
哥們試了試,若是上面的@JsonFormat 和@Temporal 疊加使用,
若是Temporal是@Temporal(TemporalType.TIMESTAMP)
,JsonFormat
優先
若是是 @Temporal(TemporalType.DATE)
,則是@Temporal優先
正如上面的,咱們靈活使用,好處有不少,若是之後咱們統一給前臺返回的是正規軍,則建議年月日的使用@Temporal(TemporalType.DATE)
其餘有時分秒的使用@JsonFormat
甚至均可以使用它,
@Temporal之後項目中能夠不使用,由於mysql會自動幫咱們識別。除非必要轉化,好比非要將datetime的時分秒去掉變成00:00:00 使用@Temporal(TemporalType.DATE)
,不然正常設計就想好怎麼使用。
感興趣的,歡迎添加博主微信,
哈,博主很樂意和各路好友交流,若是滿意,請打賞博主任意金額,感興趣的在微信轉帳的時候,備註您的微信或者其餘聯繫方式。添加博主微信哦。
請下方留言吧。可與博主自由討論哦
微信 | 微信公衆號 | 支付寶 |
---|---|---|