【问题标题】:Java XStream -Serializing Date objects results in the time being incorrect by an hourJava XStream - 序列化日期对象导致时间不正确一个小时
【发布时间】:2011-02-22 11:26:28
【问题描述】:

我正在使用 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

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

干杯,

皮特

【问题讨论】:

  • 如果 XStream 序列化和System.out.println 发生在不同的机器上,请检查它们的时区设置。
  • 它们发生在同一台机器上...
  • 嗯,好的,我重新检查了。反序列化对象中的日期不正确。将更改问题以表明这一点。
  • 不要使用java.util.Date中的toString()...打印出调用getTime()的结果就可以了。那是内部数据表示,没有搞乱时区。

标签: java xml serialization date


【解决方案1】:

我怀疑你的 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 时代……

【讨论】:

  • 为我打印 1970 年 1 月 13 日星期二 21:38:31 GMT 1970!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
相关资源
最近更新 更多