我正在使用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)
如您所见,输出日期是一小时 - 我该如何解决这个问题?
干杯,
皮特
我怀疑你的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)
这留下了两个问题:
编辑:好的,取得进展:
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时代......