gpt4 book ai didi

Java XStream - 序列化日期对象导致时间不正确一小时

转载 作者:数据小太阳 更新时间:2023-10-29 02:59:10 26 4
gpt4 key购买 nike

我正在使用 XStream 将包含日期字段的对象序列化为 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

这是输出的 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>

现在,使用 XStream 反序列化:

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

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

干杯,

皮特

最佳答案

我怀疑您的 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
}
}

所以 XML 在我看来是正确的。

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

编辑:为了让事情更加困惑,.NET 和 Mono 似乎认为它是 20:38:31:using 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"));
}
}

我很困惑......

编辑:好的,我们可以很容易地解决这个问题。 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
}
}

所以还有两个问题:

  • 为什么 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));
}
}

想知道 GMT 是否不是 1970 年的 UTC,这可以解释事情...现在检查...

编辑:好的,我知道是什么导致了这里的困惑。从 1968 年 10 月 27 日到 1971 年 10 月 31 日,英国使用的是 UTC+1(实际上,UTC 本身直到 1972 年才引入)。所以当它在这里说“GMT”时,它真的意思是“此时欧洲/伦敦的时区”,这不是真正的 GMT。尤其不幸的是,这种怪事发生在 Unix 时代......

关于Java XStream - 序列化日期对象导致时间不正确一小时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5077468/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com