7

我一直在搜索java.util.Date序列化和不同的客户端/服务器语言环境问题。

对于那些不了解此事的人,这里有一个简短的解释:

RPC 中的 GWT 日期序列化是根据您拥有的语言环境完成的。因此,如果客户端和服务器具有不同的语言环境,则用户可以输入一个日期,服务器最终将根据其语言环境将其他日期存储在数据库中。

这是一种预期的行为,在许多情况下似乎是正确的行为。

例如,如果您从纽约的浏览器中安排某个日期/小时的会议,那么在 SF 检查会议时间的人看到相应的区域设置值是正确的。

现在出生日期呢?在这种情况下,如果您出生于 12 月 5 日,那么中国的某个人读到您出生于 12 月 6 日似乎并不准确。

有些人说一种解决方案可能是使用字符串而不是日期,但我不这么认为,主要是因为例如你不能添加或减去字符串。

所以我认为解决这个问题的最好方法是自定义序列化,但不幸的是 GWT 提供了自己的Date_CustomFieldSerializer

对于我所阅读的内容,唯一的解决方案是制作您自己的文件版本并重新编译 GWT 源代码。我不想这样做,所以这就是为什么我要问是否有人知道任何更好的解决方案,或者 GWT 人员是否正在计划例如一些插件序列化基础设施用于未来的版本。

提前致谢。丹尼尔

4

1 回答 1

4

Ajava.util.Date代表某个特定的时刻。你出生在一个特定的时刻;在您所在的时区可能是 12 月 5 日,但在中国是 12 月 6 日,这不会改变您出生的确切时间。

似乎您想要存储“日-月-年”三元组,而不是特定的时间。如果是这种情况,则将其存储为三元组(可能序列化为字符串),而不是java.util.Date; 换句话说,为工作使用正确的工具。

您说您认为这是错误的,因为“<em>您无法添加或减去字符串”。好吧,您也不要添加或减去日期。如果您想对日期进行一些计算,那么要么这意味着您实际上想要存储一个日期(并且忍受中国人看到您出生于 12 月 6 日这一事实,因为那是您恰好出生的日期他的时区,而不是 12 月 5 日,这是您所在时区的日期),或者您想暂时将您的 DMY 三元组转换为日期(并进行近似计算,导致您的中国朋友过早祝您生日:12 月在您的时区仍然是 12 月 4 日时,在他的时区中排名第 5)。
使用DateTimeFormat,将日期序列化/解析为 DMY(yyyy-MM-dd例如)并始终使用当前时区。

顺便说一句:说RPC 中的 GWT 日期序列化是根据您所拥有的语言环境来完成的,这是不准确的:GWT 序列化日期的时间戳(自 Epoch 返回的秒数java.util.Date#getTime()),这特别依赖于时区。
更不用说语言环境!=时区。

于 2012-05-29T13:52:24.273 回答