GWT中的客户端时区支持

29
我正在开发一个GWT应用程序,需要支持以下场景:
服务器位于A时区
客户端浏览器设置为B时区
GWT应用程序配置为在C时区显示日期/时间

由于GWT不支持Calendar,并且JavaScript的本地时区支持不存在,我无法想到一个好的和清晰的解决方案来解决这个问题。

你们中是否有人做过类似的事情或者知道我可以使用的好工具?

谢谢!


您如何处理使用不同于GWT所使用的时区? - Fedearne
6个回答

25

根据我的经验,在处理gwt中的日期和时区时,以下最佳实践显著降低了复杂性和混淆:

  1. 在应用程序内操作/存储日期时,将所有日期视为GMT时区自纪元以来的毫秒。您可以将它们存储为字符串或整数,这并没有真正的区别。
  2. 每当向最终用户显示日期时,使用适当的时区格式化日期。

对于您的情况,当您在服务器上创建日期(时区A)时,请在将其发送到客户端之前将其转换为GMT自纪元以来的毫秒。在客户端上,使用DateTimeFormat(或编写自己的日期格式化程序)将其转换为适当的时区B或时区C。


我错过了DateTimeFormat Java文档中有关处理时区的部分。看起来它提供了我所需要的确切功能!我将与您提出的方法相结合使用它。谢谢! - Hedenius Access

6
你无法更改GWT时区,因此所有java.util.Date都具有浏览器时区。您需要手动处理当前时区设置。
我看到三个选项:
  1. 您需要自己管理时区转换。

  2. 您可以像这篇文章中所述那样覆盖java.util.Date的序列化/反序列化器。也许使用一个自定义的java.util.Date实现,覆盖getTimezoneOffset()方法。这种方法需要重新编译GWT API!

  3. 您可以通过扩展java.util.Date(就像选项2中一样)或将其包装在某个时区对象中来实现自己的日期。在此选项中,CustomFieldSerializer仍然可能有用,但无需重新编译GWT API。

我更倾向于选项3。至少在GWT RPC将来可能支持覆盖CustomFieldSerializer之前,这是一个好选择。

有用的日期/时间格式提示。


一个 java.util.Date 对象没有时区的概念。 - EisenRatte

3
Dave Paroulek的回答是正确的方法。如果您想看一个例子,在这里我们创建了小部件,它们独立于时区工作,并在服务器端处理值,所以我们拥有需要的所有时区信息。 UTCDateBox - GWT DateBox的包装器,总是选择GMT午夜的日期,将值表示为长整型而不是日期。 UTCTimeBox - 新的小部件,总是选择自午夜以来的毫秒为时间,与时区无关,也表示为长整型。 UTCDateTimeUtils - 服务器端代码,将日期分成两个适合于给定时区的UTCDateBox和UTCTimeBox的长整型值,并将它们组合成给定时区的日期。

这是日期和时间控件一起使用的示例。

博客文章描述了它们的实现方式。

这些小部件可在GitHub上获得。


糟糕,由于Google Code已经关闭,所有链接都失效了。 - Phuah Yee Keat
我已经更新了链接,使其指向项目现在位于GitHub的位置。 - andykellr

2
我假设您在此处使用RPC调用进行服务器-客户端通信。还假设您不关心时区B,并且您知道服务器上时区C是什么。
您有几个选择:
1. 在服务器上计算所需日期(在那里,您可以做任何Java限制),并将其以字符串形式发送到客户端显示,这样您就不必在客户端上进行任何转换。
2. 在服务器上计算时区A和C之间的偏移量,应用于您将传递给客户端的所有日期对象,并在客户端上仅显示它们。
如果由于某种原因以上两种方法都无效,则可以:
3. 计算偏移量,将其发送到客户端,并通过将其转换为毫秒、添加偏移量,然后再次创建日期对象来将其应用于从服务器接收到的任何日期。

0

0

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