还有其他解决方案,而不是破解Date_CustomFieldSerializer并重新编译GWT

Dan*_*son 7 gwt serialization date

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

对于那些没有被告知此事的人,这里有一个简短的解释:

GWT日期RPC中的序列化是根据您拥有的语言环境完成的.因此,如果客户端服务器具有不同的区域设置,则用户可以输入一个日期,并且服务器将最终在数据库上存储其他日期,具体取决于其区域设置.

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

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

那么出生日期呢?在这种情况下,如果你出生于12月5日,那么中国的一些人读到你在12月6日出生时看起来并不准确.

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

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

对于我所读到的,唯一的解决方案是执行此文件的自己版本并重新编译GWT源.我不想这样做,所以这就是为什么我要问是否有人知道更好的解决方案,或者GWT的人是否正在为未来版本规划一些插件序列化基础设施.

提前致谢.丹尼尔

Tho*_*yer 4

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

\n\n

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

\n\n

你说你认为这是错误的,因为 \xe2\x80\x9c你无法添加或减去字符串\xe2\x80\x9d。好吧,您也不必添加或减去日期。如果你想对日期进行一些计算,那么要么意味着你实际上想要存储一个日期(并且接受中国人看到你出生于 12 月 6 日的事实,因为那是你碰巧的日期出生在他的时区,而不是 12 月 5 日,这是您所在时区的日期),或者您想暂时将您的 DMY 三元组转换为日期(并进行近似计算,导致您的中国朋友有一天祝您生日太早了:在他的时区是 12 月 5 日,而在你的时区仍然是 12 月 4 日)。
\n这相当简单,使用DateTimeFormat,将日期序列化/解析为 DMY(yyyy-MM-dd例如)并始终使用当前时区。

\n\n

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

\n