Java XStream -Serializing Date对象导致时间错误一小时

2 java xml serialization date

我正在使用XStream将包含Date字段的对象序列化为XML,然后再返回.但是,写入XML的日期比我创建的实际日期早一个小时.

MyComplexObject o = new MyComplexObject();
o.addChild(new MyComplexObjectChild(2, {0.1, 0.1, 0.2, 0.3, 0.5}, new Date(1111111111));
System.out.println(new Date(1111111111)); //Tue Jan 13 21:38:31 GMT 1970
//serialize using XStream
Run Code Online (Sandbox Code Playgroud)

这是输出的XML:

 <MyComplexObject>           
     <children>
         <MyComplexObjectChild>
              <someNumber>2</someNumber>
              <someOtherNumbers>
                  <double>0.1</double>
                  <double>0.1</double>
                  <double>0.2</double>
                  <double>0.3</double>
                  <double>0.5</double>
              </someOtherNumbers>
              <date>1970-01-13 21:38:31.111 GMT</date>
        </MyComplexObjectChild>
    </children>
</MyComplexObject>
Run Code Online (Sandbox Code Playgroud)

现在,使用XStream反序列化:

MyComplexObject o = xstream.fromXML(output);
System.out.println(o.getDate()) //Tue Jan 13 22:38:31 GMT 1970
Run Code Online (Sandbox Code Playgroud)

如您所见,输出日期是一小时 - 我该如何解决这个问题?

干杯,

皮特

Jon*_*eet 5

我怀疑你的JRE有些奇怪的事情发生了:

import java.util.*;

public class Test {
  public static void main(String[] args) {
      Date d = new Date(1111111111);
      System.out.println(d); // Prints Tue Jan 13 21:38:31 GMT 1970
  }
}
Run Code Online (Sandbox Code Playgroud)

所以XML看起来对我来说是正确的.

使用C#进行测试只是为了检查......

编辑:只是为了让事情更加混乱,.NET和Mono似乎认为它是20:38:31:使用System;

class Test
{
    static void Main()
    {
        DateTimeOffset epoch = new DateTimeOffset(1970, 1, 1, 0, 0, 0,
                                                  TimeSpan.Zero);
        TimeSpan millis = TimeSpan.FromMilliseconds(1111111111);
        // Prints 1970-01-13 20:38:31Z
        Console.WriteLine((epoch + millis).ToString("u"));
    }
}
Run Code Online (Sandbox Code Playgroud)

我糊涂了...

编辑:好的,我们可以很容易地解决这个问题.1111111111毫秒是~308.64小时,这是12天20小时...这意味着.NET就在这里.

不知道为什么Java声称它是晚上9点.尝试使用Joda ......

编辑:Joda确认.NET结果:

import org.joda.time.*;

public class Test {
  public static void main(String[] args) {
      DateTime dt = new DateTime(1111111111, DateTimeZone.UTC);
      System.out.println(dt); // Prints 1970-01-13T20:38:31.111Z
  }
}
Run Code Online (Sandbox Code Playgroud)

这留下了两个问题:

  • 为什么OP的机器打印22:38:31?
  • 为什么我的机器打印21:38:31?

编辑:好的,取得进展:

import java.util.*;
import java.text.*;

public class Test {
  public static void main(String[] args) {
      Date date = new Date(1111111111);
      DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
      df.setTimeZone(TimeZone.getTimeZone("UTC"));
      // Prints 1970-01-13 20:38:31 UTC
      System.out.println(df.format(date));
  }
}
Run Code Online (Sandbox Code Playgroud)

知道格林威治标准时间是不是1970年的UTC,这可以解释事情...现在检查......

编辑:好的,我已经知道这会引起什么混乱.从1968年10月27日到1971年10月31日,英国处于UTC + 1(实际上 - UTC本身直到1972年才被引入).因此,当它在这里说"GMT"时,它实际上意味着"此时欧洲/伦敦的时区",这不是真正的GMT.特别不幸的是,这种奇怪的事情发生在Unix时代......