2015-02-11 68 views
2

我們在java.util.Date對象的序列化JAXB /反序列化過程中使用的SimpleDateFormat,我寫如下的效用來實現這一目標SimpleDateFormat.parse和SimpleDateFormat.format不產生相同的值

public DateFormat getDateFormat(String format){ 
     DateFormat formatter = new SimpleDateFormat(format); 
     formatter.setLenient(false); 
     return formatter; 
} 

@Test public void testMarshallUnmarshall(){ 
    String str1 = "2001-07-04T12:08:56.235-07:00"; // Example from http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html  DateFormat formatter = getDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); 
    Date date = formatter.parse(str1); 
    String str2 = formatter.format(date); 
    assertEquals(str1.equals(str2)); //This fails } 

我注意到是str1 =「2001-07-04T12:08:56.235-07:00」;和str2 = 2001-07-04T14:08:56.235-05:00

我需要做些什麼來確保兩個日期是一樣的?

感謝

+1

你應該編輯並告訴我們什麼'formatter'(在'testMarshallUnmarshall') – 2015-02-11 19:55:34

+0

我的道歉,雖然複製文本到這篇文章,下面的代碼是不正確可見。 formatter派生爲DateFormat formatter = getDateFormat(「yyyy-MM-dd'T'HH:mm:ss.SSSXXX」); – KumarRaja 2015-02-11 20:01:42

回答

3

兩個字符串代表在同一​​時刻 - 它只是一個具有不同的UTC比其它的補償。

這是可以預料的 - 一個Date代表一個時間點,它看起來像你已經設置了SimpleDateFormat使用默認的系統時區。因此,無論何時您解析的時間偏移量不是系統默認時區中的時間偏移量,都將無法對字符串進行往返。

如果比較Date值,你會發現他們相等的 - 換句話說,如果你有date比較formatter.parse(str2),這應該是罰款。

或者,使用始終使用UTC的格式,而不是指定時區偏移量的格式...或使用可保留偏移量的不同數據類型。

+0

謝謝Jon Skeet – KumarRaja 2015-02-13 03:19:37

相關問題