GWT中的客户端时区支持

时间:2009-11-06 09:26:47

标签: java gwt timezone

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

显示日期/时间

由于GWT不支持日历和本机支持时间 javascript中的区域是不存在的我想不到一个漂亮和干净 解决这个问题。

你们有没有做过类似的事情,或者你知道有什么好处 我可以使用的工具?

谢谢!

6 个答案:

答案 0 :(得分:25)

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

  1. 每当在应用程序中操作/存储日期时,将所有日期视为自GMT时区中的纪元以来的毫秒数。你可以将它们存储为字符串或整数,但它并没有什么区别。
  2. 每当向最终用户显示日期时,请使用适当的时区格式化日期。
  3. 对于您的情况,当您在服务器上创建日期(时区A)时,将其转换为格林威治标准时间以来的毫秒数,然后再将其发送给客户端。在客户端上,使用DateTimeFormat(或编写自己的日期格式化程序工具)将其转换为适当的时区B或时区C.

答案 1 :(得分:6)

您无法更改GWT时区,因此所有java.util.Date都具有浏览器时区。您需要手动处理当前时区设置。

我看到3个选项:

  1. 您可以自行管理时区转换。

  2. 您覆盖java.util.Date的序列化工具/反序列化工具,如in this post。并且可能使用自定义java.util.Date实现,它会覆盖getTimezoneOffset()。这种方法需要重新编译GWT API!

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

  4. 我更喜欢选项3.至少在GWT RPC可能有一天支持覆盖CustomFieldSerializer的


    Usefull date/time formatting hints.

答案 2 :(得分:3)

Dave Paroulek的回答是正确的方法。如果你想看一个这样的例子,我们创建了独立于TimeZone的小部件,并在服务器端处理我们拥有所需的所有TimeZone信息的值。

UTCDateBox - GWT DateBox周围的包装器,并始终在GMT午夜选择日期,并将值表示为Long而不是Date。

UTCTimeBox - 新的小部件,从午夜开始总是选择毫秒时间,与时区无关,也表示为长。

UTCDateTimeUtils - 服务器端代码,它将Date分成适合给定TimeZone中的UTCDateBox和UTCTimeBox的2个Long值,并将它们组合回给定TimeZone中的Date。

Here is an example of the date the time controls being used together.

Blog article describing their implementation.

These widgets are available on GitHub.

答案 3 :(得分:2)

我假设你在这里使用RPC调用进行服务器 - 客户端通信。还假设您不关心时区B,并且您知道服务器上的时区C.

你有几个选择:

  • 计算服务器中的所需日期(没有Java限制你可以在那里做什么)并将其发送到一个字符串以显示给客户端,因此您不必再在客户端上进行任何转换。

或:

  • 计算服务器上时区A和C之间的偏移量,将其应用于传递给客户端的所有Date对象,并将其显示在客户端上。

如果出于某种原因,这些都不适合你

  • 计算偏移量,将其发送到客户端并将其应用于从服务器收到的任何日期,方法是转换为ms,添加偏移量,然后再次创建Date对象。

答案 4 :(得分:0)

查看此演示项目 GWT timezone demo project

答案 5 :(得分:0)

我专门为此目的创建了GWT-compatible Java version jsTimezoneDetect Javascript library。这应该提供(非常好的猜测)时区名称纯粹在客户端。请随意尝试,让我知道它是否有效或不适合你。