2010-01-20 45 views
8

GWT不能正确序列化Java日期。当我尝试通过电话发送用JavaScript创建的日期时,我发现从1983年4月1日(有趣)到10月25日之间的日期会被扣除一天。GWT java.util.Date序列化错误

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

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

我也尝试向GWT团队提交错误,但好奇的是无法找到GWT的错误跟踪器。

所以,我的问题是:

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

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

+1

我们遇到了其他与Date相关的问题(不知道它们是什么),所以我们切换到了Strings。 – Drejc 2010-01-20 20:40:12

回答

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:你总是可以通过“自毫秒1970年1月1日00:00:00 GMT '通过异步服务 - 你可以在日期对象上使用getTime()获得。在服务器端,您可以实例化一个新的Date,在构造函数中传入此值:
Date date = new Date(millis);
这节省了用格式化程序和解析器的操作。

+1

实际上,GWT已经使用毫秒进行序列化,但它会降低时区。因此,浏览器中的“3. April 2001 00:00 GMT”可能会变成服务器上的“2001年4月23日23:00”。如果你只看到日期似乎是休息一天,即使实际时间意味着相同。 – Stroboskop 2012-01-20 13:31:08

0

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

1

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

虽然没有遇到过您的具体问题。

2

日期和时间是一个复杂的主题。转换可能取决于浏览器运行的区域设置,以及服务器上的JVM和客户端的语言环境是否最新。

在某些情况下可能会有差异,因为在某些地区他们过去会切换时区。

GWT自发布时间起仅使用millis发送日期。由于它使用的是Date对象,因此服务器端的日期将被自动修改为服务器时区。您确定您考虑到客户端和服务器之间的时区可能存在差异吗?

大卫

+0

在我的情况下,服务器和客户端都在同一台机器上运行,所以它肯定是GWT序列化问题。 – Domchi 2010-01-23 03:54:22

+0

他们可能现在在相同的时区。但看着日期,我想你只是发现夏令时。其中一台机器/服务在序列化时间时没有考虑到这一点。不管如何 - 我不认为你想要做一个依赖于浏览器的时区与服务器相同的web服务。 – Stroboskop 2012-01-20 13:25:33

1

可能出现的问题是索里在客户端/服务器时区的差异。

+0

查看我对David的回复,客户端和服务器处于同一时区。我相信问题在于Javascript和Java的处理日期不同,所以发送毫秒数不够好。 – Domchi 2011-01-12 09:34:05