首先使用springboot開發網站時,經常會涉及到日期的形式,那麼在代碼中使用java.util.Date來轉化為json格式的字元串,應該怎樣轉化呢?将Date類型存入資料庫有應該怎樣實作呢?
Date與json的互相轉換
實作Date轉換為json格式,json格式轉化為Date的方式總的來說有兩種。
1.使用全局配置
在application.properties配置檔案中增加下面兩個配置:
#時區設定
spring.jackson.time-zone=GMT+8
日期期時格式設定置
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
這樣配置下來的話所有需要與json字元串互轉的Date格式都為:yyyy-MM-dd HH:mm:ss。
下面我們在設定好後測試一下:
其中測試類DateTest1的代碼如下:
package com.JPAdemo.JPAdemo.modle;
import java.util.Date;
public class DateTest1 {
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
controller如下:
@GetMapping("/1")
public DateTest1 test1(){
DateTest1 dateTest1=new DateTest1();
dateTest1.setDate(new Date());
return dateTest1;
}
運作後使用PostMan測試:

2.使用@Jsonformat、@datetimeformat兩個注解局部設定。
與全局配置相比較,使用這兩個注解就更加的精細,隻需要在你所需要的地方使用這兩個注解即可,并且可以設定不同的時間格式。具體使用見下面的Demo:
測試類DateTest2:
package com.JPAdemo.JPAdemo.modle;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
public class DateTest2 {
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date date1;
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd")
private Date date2;
@DateTimeFormat(pattern = "HH:mm:ss")
@JsonFormat(pattern = "HH:mm:ss")
private Date date3;
public DateTest2() {
}
public Date getDate1() {
return date1;
}
public void setDate1(Date date1) {
this.date1 = date1;
}
public Date getDate2() {
return date2;
}
public void setDate2(Date date2) {
this.date2 = date2;
}
public Date getDate3() {
return date3;
}
public void setDate3(Date date3) {
this.date3 = date3;
}
}
controller:
//測試Date與json格式的互相轉換------局部注解
@GetMapping("/2")
public DateTest2 test2(){
DateTest2 dateTest2=new DateTest2();
dateTest2.setDate1(new Date());
dateTest2.setDate2(new Date());
dateTest2.setDate2(new Date());
return dateTest2;
}
運作結果:
其中pattern 的值指定了Date與json字元串互相轉化的格式。**當全局設定和局部設定同時使用時,局部設定會失效
!!!
**
- Date在資料庫中的存取
Date在資料庫中的存取,我還沒有發現全局設定,目前發現隻能通過注解@Temporal來實作。
@Temporal的定義如以下所示:
public @interface Temporal {
TemporalType value() default TIMESTAMP;
}
從定義可以看出,在使用@Temporal注解時,需要指定枚舉類型TemType的值,如果不指定的話預設為TemporalType.TIMESTAMP,一共有三個可選的值:TemporalType.TIME、TemporalType.DATE、TemporalType.TIMESTAMP。具體的使用看下面的Demo:
DateTest3:
package com.JPAdemo.JPAdemo.modle;
import org.springframework.web.bind.annotation.RequestMapping;
import javax.persistence.*;
import java.util.Date;
@Entity
public class DateTest3 {
@Id
@GeneratedValue
private Integer id;
//存取日期+時間
@Temporal(TemporalType.TIMESTAMP)
private Date date1;
//存取時間
@Temporal(TemporalType.TIME)
private Date date2;
//存取日期
@Temporal(TemporalType.DATE)
private Date date3;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Date getDate1() {
return date1;
}
public void setDate1(Date date1) {
this.date1 = date1;
}
public Date getDate2() {
return date2;
}
public void setDate2(Date date2) {
this.date2 = date2;
}
public Date getDate3() {
return date3;
}
public void setDate3(Date date3) {
this.date3 = date3;
}
}
controller:
@Autowired
DateTest3Repository dateTest3Repository;
//測試Date在資料庫中的存取
@GetMapping("/3")
public void test3(){
DateTest3 dateTest3=new DateTest3();
dateTest3.setDate1(new Date());
dateTest3.setDate2(new Date());
dateTest3.setDate3(new Date());
dateTest3Repository.save(dateTest3);
}
運作結果:
需要注意的是,TemporalType的三個不同的枚舉值對應着資料庫中三中不同的時間字段類型,着可以通過在資料庫中輸入SHOW TABLE 表名 來檢視它們分别對應的類型,正因為這些枚舉值對應着不同的字段類型,換而言之,當修改其中的枚舉值時,對應的表結構也會發生變化,如果你使用的JPA操作資料庫的政策是:spring.jpa.hibernate.ddl-auto=update那麼必須在修改了TemporalType的值之後删除原先已經建立的表,讓JPA在資料庫中從新建立表。否則,即使修改了值,根據update的政策,它并不會改變資料庫中表中的字段類型,意味着修改無效。
三種不同的枚舉值對應者不同的MySQL中時間類型:
TemporalType.TIME--time、TemporalType.DATE--date、TemporalType.TIMESTAMP--datetime
表結構: