除了黑客Date_CustomFieldSerializer和重新编译GWT之外,还有其他解决方案吗?



我一直在搜索有关java.util.Date序列化和不同客户端/服务器区域设置问题的时间。

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

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

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

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

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

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

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

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

提前谢谢。丹尼尔

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

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

说你认为这是错误的,因为"你不能添加或减少字符串"。好吧,您也不添加或减去日期。如果你想用日期做一些计算,那么要么意味着你实际上想要存储一个日期(并接受中国人看到你出生在 12 月 6 日的事实,因为那是你碰巧出生在他的时区的日期,而不是 12 月 5 日,这是你时区的日期), 或者你想暂时将你的DMY三胞胎转换为一个日期(并进行近似计算,导致你的中国朋友提前一天祝你生日:12月5日在他的时区,而在你的时区仍然是12月4日)。
这相当容易,使用 DateTimeFormat ,将日期序列化/解析为 DMY(例如yyyy-MM-dd)并始终使用当前时区。

顺便说一句:说 RPC 中的 GWT 日期序列化是根据您拥有的区域设置功能完成的,这并不准确:GWT 序列化日期的时间戳(自 Epoch 以来的秒数,由 java.util.Date#getTime() 返回),这特别依赖于时区。
更不用说那个区域设置!=时区。

最新更新