1. 程式人生 > >Spring boot 中java.util.Date 在json、資料庫之間格式的相互轉換

Spring boot 中java.util.Date 在json、資料庫之間格式的相互轉換

首先使用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;

/**
 * Created by dell on 2017/8/8.
 */
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;

/**
 * Created by dell on 2017/8/8.
 */
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;

/**
 * Created by dell on 2017/8/8.
 */
@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

表結構:
這裡寫圖片描述

本篇文章所用到的程式碼可以在我的GitHub上找到。