有没有其他解决方案比黑客日期
我一直在寻找java.util.Date Serialization和不同的客户端/服务器区域设置问题。
对于那些不了解此事的人,这里是一个简短的解释:
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月当时仍然是你的时区12月4日)。
这很容易,使用DateTimeFormat
,序列化/解析日期到DMY(例如yyyy-MM-dd
),并始终使用当前时区。
BTW:说RPC中的GWT日期序列化是根据你所使用的语言环境的功能来完成的:GWT序列化日期的时间戳(从Epoch开始的秒数,由java.util.Date#getTime()
返回),具体不是时区相关。
更不用提locale!=时区了。