GWT Java.util.Date序列化bug

9
GWT不能正确地序列化Java日期。当我试图将在Javascript中创建的日期通过网络发送时,我发现1983年之前4月1日(有趣)和10月25日之间的日期会减少一天。

这意味着,例如,1982-04-01和1982-03-31在Java端都变成了1982-03-31。

考虑到所涉及的日期,我猜测这是某种夏令时问题。我尝试过搜索,只找到了一个描述类似问题的参考文献

我还尝试向GWT团队提交错误报告,但奇怪的是找不到GWT的错误跟踪器。

因此,我的问题是:

  1. 其他人遇到过这个问题吗?我使用的是GWT 1.7,并想确认是否在2.0上也会出现此问题。

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


1
我们遇到了其他日期相关的问题(不记得是什么了),所以我们转而使用字符串。 - Drejc
6个回答

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 = new Date(millis);
这样可以避免使用格式化程序和解析器。

1
实际上,GWT已经使用毫秒进行序列化,但它会丢弃时区信息。因此,在浏览器中的“3. April 2001 00:00 GMT”可能会在服务器上变成“2. April 2001 23:00 CET”。如果你只看日期,似乎会少一天,尽管实际时间是相同的。 - Stroboskop

2
日期和时间是一个复杂的主题。转换可能取决于浏览器运行的区域设置以及服务器上的 JVM 和客户端区域设置是否最新。
在某些情况下,可能会有差异,因为在一些地区过去曾经更改过时区。
GWT 使用自纪元时间以来的毫秒数发送日期。由于它使用 Date 对象,您受限于服务器端的日期将自动修改为服务器时区的时间。您确定考虑了客户端和服务器之间可能存在的时区差异吗?
David

在我的情况下,服务器和客户端都在同一台机器上运行,所以这肯定是GWT序列化问题。 - Domchi
他们现在可能处于同一时区。但是从日期上看,我认为你刚刚发现了夏令时。而且其中一个机器/服务在序列化时间时没有考虑到这一点。无论如何,我认为你不想做一个依赖于浏览器时区与服务器时区相同的 Web 服务。 - Stroboskop

2

1
如果您不需要进行客户端转换(适应用户的时区)或计算,请从服务器以字符串形式发送它。
尽管如此,我从未遇到过您特定的问题。

1
可能的问题源在于客户端/服务器时区不同。

看到我对David的回复,客户端和服务器在同一个时区。我认为问题在于Javascript和Java处理日期的方式不同,所以仅发送毫秒是不够的。 - Domchi

0
我们也遇到了类似的问题。那已经是很久以前的事情了,我记不得具体的细节,但大概的情况是java.util.Date和Javascript处理日期的方式存在一些微小的差异。我们采用的解决方法与你们的大致相同,即通过网络传送的实际值通常是一个字符串。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接