2017-04-10 21 views
0

我有一個簡單的服務,將一個日期作爲一個字符串(其他字段),並將其保存到mySql數據庫。我正在使用Hibernate的Spring Boot。 如果我張貼的日期與{"expenseDate":"04/02/2017"}傑克遜映射後的日期是「2017-04-01 19:00:00」。順便說一句,如果我查看數據庫中的行,日期就像我期望的那樣是「2017-04-02」。當我查詢服務時,json中返回的日期是正確的,但是當我從數據庫轉儲出行時,它們都會返回正確的日期減去六個小時。春季休眠不需要的時區調整

我住在中央時區,所以我的猜測是數據庫中的日期是UTC,春天因爲處於中央時間而需要六個小時。

控制器:

@PostMapping("/expenses") 
public ResponseEntity<Expense> submitExpense(@RequestBody Expense expense) throws BadHttpRequest { 
    expenseService.saveExpense(expense); 
    return new ResponseEntity<>(expense, HttpStatus.CREATED); 
} 

實體:

@Entity 
public class Expense { 
@Id 
@GeneratedValue 
Integer id; 
Double cost; 
String location; 
String expenseType; 
String description; 

@JsonFormat(pattern = "MM/dd/yyyy") 
Date expenseDate; 

我試圖@JsonFormat(pattern = "MM/dd/yyyy", timezone = "UTC")上的日期字段,但它什麼也沒有改變。

我也嘗試從視圖中使用日期部分構造日期並將其作爲長期傳遞給服務,但結果是相同的。顯然我錯過了極其重要的事情,而且可能很簡單。

有什麼想法?

+0

當您在JSON輸入中傳遞04/02/2017時,哪個時區應該是該日期?您的服務的使用者是否應該在UTC中通過日期? –

+0

對我來說可能有點天真,但是我會假定沒有任何修改的那個日期的值,所以截斷的日期將具有傳入的值。而這正是它在數據庫中的樣子,所以它看起來像我所做的是正確的,除非沒有加起來正確,當我攔截對象的實際值是關閉 – nbpeth

回答

1

你應該設置 「時區」 到任何時區你期望進入的日期爲英寸

public class Data { 

    @JsonFormat(pattern = "MM/dd/yyyy", timezone="GMT-04:00") 
    Date date; 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 
} 

public class Main { 

    public static void main(String[] args) throws JsonParseException, JsonMappingException, IOException { 

     ObjectMapper mapper = new ObjectMapper(); 
     Data data = mapper.readValue("{\"date\" : \"04/02/2017\"}", Data.class); 
     System.out.println(data.date); 
    } 
} 

輸出

太陽4月2日00:00:00 EDT 2017年

// I am located in EDT 

如果我假設傳入日期是UTC

@JsonFormat(pattern = "MM/dd/yyyy", timezone="UTC") 
Date date; 

輸出

週六4月1日20:00:00 EDT 2017年

默認情況下,這似乎是考慮到日期UTC。在你的情況下,如果你在科技委你應該考慮設置中央時間時區(我相信美國/中央)。

Note 如果您的日期輸入可以在不同的時區,這將是另外一個討論來自客戶端。您很可能必須定義客戶在特定時區輸入日期的合同,或者明確指定時區作爲附加輸入,或讓客戶端(如果存在)對您的服務器端期望的特定時區進行轉換。

+0

這是一個很大的幫助 - 結合下面的答案。我已經在數據庫連接屬性和實體的json格式上將時區設置爲UTC - 將其更改爲我的本地時區可解決問題。現在它都響了,如果我沒有設置數據庫參數,並讓春天使用默認的時區,這是不會發生的 – nbpeth

1

有一個數據庫連接url參數,可能需要放在serverTimezone中。

+0

這是問題的一部分 - 我有屬性設置在數據庫網址爲UTC - 我需要將其更改爲當地時區。如果我單獨使用它來使用數據庫的默認值並且彈簧使用默認值,那就沒問題了。謝謝! – nbpeth