【问题标题】:Client side time zone support in GWTGWT 中的客户端时区支持
【发布时间】:2010-12-13 18:34:53
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 如何处理与 GWT 使用的时区不同的时区?

标签: java gwt timezone


【解决方案1】:

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

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

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

【讨论】:

  • 我错过了 DateTimeFormat java 文档中关于处理时区的部分。似乎它提供了我需要的那种功能!我将结合您提出的方法使用它。谢谢!
【解决方案2】:

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

我看到了 3 个选项:

  1. 您自己管理时区转换。

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

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

我更喜欢选项 3。至少在 GWT RPC 可能有一天会支持覆盖 CustomFieldSerializer 之前


Usefull date/time formatting hints.

【讨论】:

  • java.util.Date 对象没有 timzone 的概念。
【解决方案3】:

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

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

UTCTimeBox - 新小部件始终选择从午夜开始的毫秒时间,独立于时区,也表示为 Long。

UTCDateTimeUtils - 服务器端代码将日期拆分为 2 个长整型值,适用于给定时区中的 UTCDateBox 和 UTCTimeBox,并将它们组合回给定时区中的日期。

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

Blog article describing their implementation.

These widgets are available on GitHub.

【讨论】:

  • 太糟糕了,现在 googlecode 已关闭所有断开的链接。
  • 我更新了链接以指向现在位于 GitHub 的项目。
【解决方案4】:

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

你有几个选择:

  • 在服务器中计算所需的日期(Java 对您可以在那里执行的操作没有限制)并将其发送到字符串中以显示给客户端,因此您无需在客户端上进行任何转换。李>

或:

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

如果由于某种原因这些都对你无效

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

【讨论】:

    【解决方案5】:

    查看这个演示项目 GWT timezone demo project

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-02-10
        • 1970-01-01
        • 2023-02-04
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多