2015-02-11 61 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

相关问题