SimpleDateFormat.parse和SimpleDateFormat.format不生成相同的值

时间:2015-02-11 19:53:14

标签: java

我们在java.util.Date对象的JAXB序列化/反序列化过程中使用SimpleDateFormat,我正在编写以下实用程序来实现它

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 个答案:

答案 0 :(得分:3)

这两个字符串代表同一时刻 - 它只是一个具有与另一个不同的UTC偏移。

这是预期的结果 - 只有Date 表示某个时间点,看起来您已使用默认系统时区设置了SimpleDateFormat。因此,每当您解析具有不同于系统默认时区中的时间偏移量的值的值时,您将无法对该字符串进行往返。

如果您比较Date值,您会发现 相等 - 换句话说,如果您将formatter.parse(str2)date进行比较,则应该没事。

或者,使用始终为UTC的格式,而不是指定时区偏移的格式...或使用可以保留偏移量的其他数据类型。