2017-03-10 25 views
0

我得到的返回實例foo的對象C#的WebAPI項目爲Java。兌換日期與GSON

foo包含在C#中兩個日期時間屬性。我已經配置了我的WebAPI的時間之後點後七位數字總是返回。所以,當對象得到了序列化JSON成,它看起來像這樣:

{ 
    "Timestamp": "2017-02-11T11:49:00.0000000", 
    "Changed": "2017-02-11T11:51:49.2620373" 
} 

現在,我嘗試反序列化的Java對象。我選擇了gson這一點。 我配置gson這樣的:

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS").create(); 

反序列化後,在Java樣子的兩個屬性:

  • 時間戳:Sat Feb 11 11:49:00,這是對
  • 更改:Sat Feb 11 12:35:29,這是錯誤的

所以我的問題是,它可以配置gson與七位數字的準確性工作,或者我應該去除的四項?

+1

不要叫'setDateFormat()',並映射到'LocalDateTime ',它實際上可以處理3位數以上的小數秒。 – Andreas

+0

安德烈亞斯是正確的:'Date'不能抱毫秒分數以及'SimpleDateFormat'不能和你面臨的是它的寬鬆風格:溢出的MS值被解釋爲秒上。如果你可以自由使用Java 8,那麼你應該使用'LocalDateTime'併爲它實現一個簡單類型的適配器。如果你不能使用Java 8'LocalDateTime'出於任何原因,你可能會檢查另一個日期/時間庫,例如約達時間,如果他們能解析MS分數和輪他們以'java.util.Date'毫秒分數。 –

回答

0

理由你獲得的是時間:

在JSON Date2017-02-11T11:51:49.2620373 假設2620373是毫秒,它實際上會導致成2620秒其爲44分鐘。

現在,如果你添加44分鐘到11:51:49,你12:35:29。默認情況下,GSON的解析是寬鬆的,這意味着它將加起來的時間/天,並調整更高的元件(例如解析32/03/2017Date將導致01/04/2017)。

如果你想忽略毫秒,那麼你可以將日期格式更改爲yyyy-MM-dd'T'HH:mm:ss.,它會導致正確的日期,例如:

public static void main(String[] args) throws Exception{ 
    Gson gson = new GsonBuilder().setLenient().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.").create(); 
    Model model = gson.fromJson("{\"Timestamp\": \"2017-02-11T11:49:00.0000000\",\"Changed\": \"2017-02-11T11:51:49.2620373\"}", Model.class); 
    System.out.println(model.getTimestamp()); 
    System.out.println(model.getChanged()); 
} 

class Model{ 
    private Date Timestamp; 
    private Date Changed; 
    public Date getTimestamp() { 
     return Timestamp; 
    } 
    public void setTimestamp(Date timestamp) { 
     Timestamp = timestamp; 
    } 
    public Date getChanged() { 
     return Changed; 
    } 
    public void setChanged(Date changed) { 
     Changed = changed; 
    } 
}