存儲日期以及查詢日期格式_日期@Temporal相關注解問題

前言

項目中常常會用到與日期相關的註解,這裏簡單介紹下吧java

第一種:——》實體類會封裝成日期「yyyy-MM-dd」的 Date類型。
第二種:——》實體類會封裝成時間「hh-MM-ss」的 Date類型。
第三種:——》實體類會封裝成完整的時間「yyyy-MM-dd hh:MM:ss」的 Date類型。mysql

一、@Temporal(TemporalType.DATE)

若是字段爲date類型,則很是匹配,查詢出來到前臺的處理直接就是2019-01-24web

若是數據庫字段爲datetime類型,則,數據庫時分秒會變成00:00:00,可是到了前臺只顯示年月日spring

二、@Temporal(TemporalType.TIME)

數據庫字段爲datetime 類型

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 ;

三、@Temporal(TemporalType.TIMESTAMP)

很是正常的數據處理,返回到前臺就是一個時間戳,到了庫裏面,年月日,時分秒數據庫

四、前面3個的總結

即便上面各有各的轉化格式,可是在咱們設置Controller它們所匹配的字段接收的時候,仍是根據前臺出來的值進行接收的(前臺傳來什麼,咱們在運行代碼的時候就是什麼,和上面的3中主鍵沒有關係),只不過在入庫,或者是在鋪數據到前臺的時候會發生一些格式轉化。

四、格式化到前臺,使用率很是高

@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`) ); */

二、controller

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

@Service
@Slf4j
public class D05DateServiceImpl implements D05DateService {

    @Resource
    private D05DateEntityRepository d05DateEntityRepository;


    public  D04DateEntity addD04DateEntity (D04DateEntity d04DateEntity){
        d05DateEntityRepository.save(d04DateEntity);
        return  d04DateEntity ;
    }

}

四、測試

4.一、添加

WX20190124-180247@2x

http://localhost:8080/jpa/date/addD04DateEntity?dateT=2019-01-24%2017%3A31%3A28&dateTTime=2019-01-24%2017%3A31%3A28&dateTTimesTamp=2019-01-24%2017%3A31%3A28&dateTimeFormat=2019-01-24%2017%3A31%3A28&dateTDate=2019-01-24%2017%3A31%3A28&cdate=2019-01-24%2017%3A31%3A28&udate=2019-01-24%2017%3A31%3A28
json

保存並返回實體的結果以下,沒有看到上面的@Temporal(TemporalType.DATE)起做用微信

{
  "id": 2,
  "dateT": "1548322288000",
  "dateTTime": 1548322288000,
  "dateTTimesTamp": 1548322288000,
  "dateTimeFormat": 1548322288000,
  "dateTDate": 1548259200000,
  "cdate": 1548322288000,
  "udate": 1548323059000
}

二、查看 http://localhost:8080/jpa/date/findById?id=2

這才提現出來,說明上面的@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),不然正常設計就想好怎麼使用。





感興趣的,歡迎添加博主微信,

哈,博主很樂意和各路好友交流,若是滿意,請打賞博主任意金額,感興趣的在微信轉帳的時候,備註您的微信或者其餘聯繫方式。添加博主微信哦。


請下方留言吧。可與博主自由討論哦

微信 微信公衆號 支付寶
微信 微信公衆號 支付寶
相關文章
相關標籤/搜索