GWT java.util.Date序列化错误

时间:2010-01-20 14:40:12

标签: datetime serialization gwt date

GWT没有正确序列化Java Date。当我尝试通过电汇发送在Javascript中创建的日期时,我发现在1983年之前的4月1日(有趣)和10月25日之间的日期减去了一天。

这意味着,例如,1982-04-01和1982-03-31都在Java方面成为1982-03-31。

鉴于有问题的日期,我猜这是某种DST问题。我试过谷歌搜索,发现只有one other reference描述了类似的问题。

我也试过向GWT团队提交bug,但奇怪的是无法找到GWT的bugtracker。

所以,我的问题是:

  1. 其他人遇到这个?我正在使用GWT 1.7,并且想确认这是否也发生在2.0上。

  2. 我的解决方法是将日期作为字符串发送,并在服务器上解析它们。任何人都知道更好的解决方法吗?

6 个答案:

答案 0 :(得分:5)

假设您使用的是java.util.Date

问题1:似乎在2.0中已修复。我在上面创建了两个日期(1982-04-01和1982-03-31),它们正确地通过服务器(两者分别代表服务器分别为1982-04-01和1982-03-31)。我的设置是:

  • GWT 2.0
  • Java 1.6
  • OSX 10.6.2

问题2:你总是可以通过async服务传递'自1970年1月1日00:00:00 GMT'以来的毫秒数 - 你可以使用日期对象上的getTime()获得。然后,在服务器端,您可以在构造函数中实例化一个新的Date传递此值:
Date date = new Date(millis);
这样可以省去格式化程序和解析器。

答案 1 :(得分:2)

日期和时间是一个复杂的主题。转换可能取决于运行浏览器的区域设置,也不依赖于服务器上的JVM和客户端的区域设置是最新的。

在某些情况下可能存在差异,因为在某些地区,他们过去曾改变过时区。

GWT从纪元时间开始仅使用millis发送日期。由于它使用Date对象,因此服务器端的日期将自动修改为服务器时区。您确定要考虑客户端和服务器之间时区的可能差异吗?

大卫

答案 2 :(得分:2)

我很确定FTR库中有一些日期模拟。

http://code.google.com/p/ftr-gwt-library

答案 3 :(得分:1)

如果您不必进行客户端转换(适应用户的时区)或计算,请从服务器以字符串形式发送。

但从未遇到过您的具体问题。

答案 4 :(得分:1)

可能存在的问题是客户端/服务器时区的差异。

答案 5 :(得分:0)

我们也遇到过类似的问题。很久以前,我不记得确切的细节,但它的要点是java.util.Date和日期在Javascript中的处理方式之间存在一些细微差别。我们的解决方法实际上与您的解决方法相同,其中通过线路发送的实际值通常是字符串。